{"id":31560338,"url":"https://github.com/cequence-io/pinecone-scala","last_synced_at":"2025-10-05T02:12:57.179Z","repository":{"id":157393108,"uuid":"630956289","full_name":"cequence-io/pinecone-scala","owner":"cequence-io","description":"Scala client for Pinecone vector database","archived":false,"fork":false,"pushed_at":"2025-08-11T09:46:24.000Z","size":491,"stargazers_count":18,"open_issues_count":0,"forks_count":0,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-08-11T19:55:02.424Z","etag":null,"topics":["ai","embeddings","pinecone","scala","vector-database"],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cequence-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-04-21T14:51:55.000Z","updated_at":"2025-08-11T09:46:27.000Z","dependencies_parsed_at":"2024-05-28T10:36:24.645Z","dependency_job_id":"53d6fb81-1b87-4ce5-8709-aa78166acf7d","html_url":"https://github.com/cequence-io/pinecone-scala","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/cequence-io/pinecone-scala","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cequence-io%2Fpinecone-scala","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cequence-io%2Fpinecone-scala/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cequence-io%2Fpinecone-scala/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cequence-io%2Fpinecone-scala/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cequence-io","download_url":"https://codeload.github.com/cequence-io/pinecone-scala/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cequence-io%2Fpinecone-scala/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278399690,"owners_count":25980332,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","embeddings","pinecone","scala","vector-database"],"created_at":"2025-10-05T02:12:44.913Z","updated_at":"2025-10-05T02:12:57.168Z","avatar_url":"https://github.com/cequence-io.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pinecone Scala Client 🗂️\n[![version](https://img.shields.io/badge/version-1.3.3-green.svg)](https://cequence.io) [![License](https://img.shields.io/badge/License-MIT-lightgrey.svg)](https://opensource.org/licenses/MIT) ![GitHub Stars](https://img.shields.io/github/stars/cequence-io/pinecone-scala?style=social) [![Twitter Follow](https://img.shields.io/twitter/follow/0xbnd?style=social)](https://twitter.com/0xbnd)\n\nThis is an intuitive async full-fledged Scala client for Pinecone API supporting all the available index, vector, collection, inference and assistant operations/endpoints, provided in two convenient services called [PineconeVectorService](./pinecone-core/src/main/scala/io/cequence/pineconescala/service/PineconeVectorService.scala) and [PineconeIndexService](./pinecone-core/src/main/scala/io/cequence/pineconescala/service/PineconeIndexService.scala). The supported calls are: \n\n* **Vector Operations**: [describeIndexStats](https://docs.pinecone.io/reference/api/2024-07/data-plane/describeindexstats), [query](https://docs.pinecone.io/reference/api/2024-07/data-plane/query), [delete](https://docs.pinecone.io/reference/api/2024-07/data-plane/delete), [fetch](https://docs.pinecone.io/reference/api/2024-07/data-plane/fetch), [update](https://docs.pinecone.io/reference/api/2024-07/data-plane/update), and [upsert](https://docs.pinecone.io/reference/api/2024-07/data-plane/upsert)\n* **Collection Operations**: [listCollections](https://docs.pinecone.io/reference/api/2024-07/control-plane/list_collections), [createCollection](https://docs.pinecone.io/reference/api/2024-07/control-plane/create_collection), [describeCollection](https://docs.pinecone.io/reference/api/2024-07/control-plane/describe_collection), and [deleteCollection](https://docs.pinecone.io/reference/api/2024-07/control-plane/delete_collection)\n* **Index Operations**: [listIndexes](https://docs.pinecone.io/reference/api/2024-07/control-plane/list_indexes), [creatIndex](https://docs.pinecone.io/reference/api/2024-07/control-plane/create_index), [describeIndex](https://docs.pinecone.io/reference/api/2024-07/control-plane/describe_index), [deleteIndex](https://docs.pinecone.io/reference/api/2024-07/control-plane/delete_index), and [configureIndex](https://docs.pinecone.io/reference/api/2024-07/control-plane/configure_index)\n* **Inference Operations**: [embedData](https://docs.pinecone.io/reference/api/2024-07/inference/generate-embeddings), [rerank](https://docs.pinecone.io/reference/api/2024-10/inference/rerank), and [evaluate](https://docs.pinecone.io/reference/api/assistant/metrics_alignment)\n* **Assistant Operations**:  [listAssistants](https://docs.pinecone.io/reference/api/2024-07/assistant/list-assistants), [createAssistant](https://docs.pinecone.io/reference/api/2024-07/assistant/create-assistant), [describeAssistant](https://docs.pinecone.io/reference/api/2024-07/assistant/describe-assistant), [deleteAssistant](https://docs.pinecone.io/reference/api/2024-07/assistant/delete-assistant), [listFiles](https://docs.pinecone.io/reference/api/2024-07/assistant/list-files), [uploadFile](https://docs.pinecone.io/reference/api/2024-07/assistant/create-file), [describeFile](https://docs.pinecone.io/reference/api/2024-07/assistant/describe-file), [deleteFile](https://docs.pinecone.io/reference/api/2024-07/assistant/delete-file), [chatWithAssistant](https://docs.pinecone.io/reference/api/2024-07/assistant/chat-completion-assistant)\n  - these operations are provided by two services: `PineconeAssistantService` and `PineconeAssistantFileService`\n\nNote that in order to be consistent with the Pinecone API naming, the service function names match exactly the API endpoint titles/descriptions with camelcase.\nAlso, we aimed the lib to be self-contained with the fewest dependencies possible therefore we ended up using only two libs `play-ahc-ws-standalone` and `play-ws-standalone-json` (at the top level).  \n\n**✔️ Important**: this is a \"community-maintained\" library and, as such, has no relation to Pinecone company.\n\n👉 Check out an article about the lib/client on [Medium](https://medium.com/@0xbnd/pinecone-scala-client-just-landed-53b3638e61b3). Also, **if you want to see hands-on examples right away, go to the [Pinecone Examples](https://github.com/cequence-io/pinecone-scala/tree/master/examples) or [OpenAI + Pinecone Examples](https://github.com/cequence-io/pinecone-scala/tree/master/openai-examples) modules.**\n\n## Installation 🚀\n\nThe currently supported Scala versions are **2.12, 2.13**, and **3**.  \n\nTo pull the library you have to add the following dependency to your *build.sbt*\n\n```\n\"io.cequence\" %% \"pinecone-scala-client\" % \"1.3.3\"\n```\n\nor to *pom.xml* (if you use maven)\n\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.cequence\u003c/groupId\u003e\n    \u003cartifactId\u003epinecone-scala-client_2.12\u003c/artifactId\u003e\n    \u003cversion\u003e1.3.3\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Config ⚙️\n\n- Env. variables: `PINECONE_SCALA_CLIENT_API_KEY`, and `PINECONE_SCALA_CLIENT_ENV` if pod-based service is used\n- File config (default): [pinecone-scala-client.conf](./pinecone-client/src/main/resources/pinecone-scala-client.conf)\n\n## Usage 👨‍🎓\n\n**Ia. Obtaining `PineconeIndexService`**\n\nFirst you need to provide an implicit execution context as well as akka materializer, e.g., as\n\n```scala\n  implicit val ec = ExecutionContext.global\n  implicit val materializer = Materializer(ActorSystem())\n```\n\nThen you can obtain a service (pod or serverless-based) in one of the following ways.\n\n- Default config (expects env. variable(s) to be set as defined in `Config` section)\n\n```scala\n  import io.cequence.pineconescala.service.PineconeIndexServiceFactory.FactoryImplicits\n\n  val service = PineconeIndexServiceFactory().asOne\n```\n\n- Custom config\n```scala\n  val config = ConfigFactory.load(\"path_to_my_custom_config\")\n  val service = PineconeIndexServiceFactory(config).asOne\n```\n\n- Without config for pod-based service (with env) - creates an instance of `PineconePodBasedIndexService`\n```scala\n  val service  = PineconeIndexServiceFactory(\n    apiKey = \"your_api_key\",\n    environment = \"your_env\" // e.g. \"northamerica-northeast1-gcp\n  )\n```\n\n- Without config for serverless service - creates an instance of `PineconeServerlessIndexService`\n```scala\n  val service = PineconeIndexServiceFactory(\n    apiKey = \"your_api_key\"\n  )\n```\n\n**Ib. Obtaining `PineconeVectorService`**\n\nSame as with `PineconeIndexService`, you need to first provide implicit execution context and Akka materializer. Then you can obtain a service in one of the following ways.\n\n- Default config (expects env. variable(s) to be set as defined in `Config` section). Note that if the index with a given name is not available, the factory will return `None`.\n```scala\n  PineconeVectorServiceFactory(\"index_name\").map { serviceOption =\u003e\n    val service = serviceOption.getOrElse(\n      throw new Exception(s\"Index with a given name does not exist.\")\n    )\n    // do something with the service\n  }\n```\n\n**Ic. Obtaining `PineconeInferenceService`**\n\nSame as with `PineconeIndexService`, you need to first provide implicit execution context and Akka materializer. Then you can obtain a service in one of the following ways.\n\n- Default config\n\n```scala\n  val service = PineconeInferenceServiceFactory()\n```\n\n- Custom config\n```scala\n  val config = ConfigFactory.load(\"path_to_my_custom_config\")\n  val service = PineconeInferenceServiceFactory(config)\n```\n\n- Directly with api-key\n```scala\n  val service = PineconeInferenceServiceFactory(\n    apiKey = \"your_api_key\"\n  )\n```\n\n**Id. Obtaining `PineconeAssistantService`**\n\n\n- Default config\n\n```scala\n  val service = PineconeAssistantServiceFactory()\n```\n\n- Custom config\n\n```scala\n  val config = ConfigFactory.load(\"path_to_my_custom_config\")\n  val service = PineconeAssistantServiceFactory(config)\n```\n\n- Directly with api-key\n\n```scala\n  val service = PineconeAssistantServiceFactory(\n    apiKey = \"your_api\"\n  )\n```\n\n**Ie. Obtaining `PineconeAssistantFileService`**\n\n- Default config\n\n```scala\n  val service = PineconeAssistantFileServiceFactory()\n```\n\n- Custom config\n\n```scala\n  val config = ConfigFactory.load(\"path_to_my_custom_config\")\n  val service = PineconeAssistantFileServiceFactory(config)\n```\n\n- Directly with api-key\n\n```scala\n  val service = PineconeAssistantFileServiceFactory(\n    apiKey = \"your_api\"\n  )\n```\n\n**II. Calling functions**\n\nFull documentation of each call with its respective inputs and settings is provided in [PineconeVectorService](./pinecone-core/src/main/scala/io/cequence/pineconescala/service/PineconeVectorService.scala) and [PineconeIndexService](./pinecone-core/src/main/scala/io/cequence/pineconescala/service/PineconeIndexService.scala). Since all the calls are async they return responses wrapped in `Future`.\n\nExamples:\n\n**Index Operations**\n\n- List indexes\n\n```scala\n  pineconeIndexService.listIndexes.map(indexes =\u003e\n    indexes.foreach(println)\n  )\n```\n\n- Create index (with default settings)\n\n```scala\n  import io.cequence.pineconescala.domain.response.CreateResponse\n\n  pineconeIndexService.createIndex(\n    name = \"auto-gpt-test\",\n    dimension = 1536\n  ).map {\n    case CreateResponse.Created =\u003e println(\"Index successfully created.\")\n    case CreateResponse.BadRequest =\u003e println(\"Index creation failed. Request exceeds quota or an invalid index name.\")\n    case CreateResponse.AlreadyExists =\u003e println(\"Index with a given name already exists.\")\n  }\n```\n\n- Describe index\n\n```scala\n  pineconeIndexService.describeIndex(\"index_name\").map(indexInfo =\u003e\n    // if not found, indexInfo will be None    \n    println(indexInfo)\n  )\n```\n\n- Delete index\n\n```scala\n  import io.cequence.pineconescala.domain.response.DeleteResponse\n\n  pineconeIndexService.deleteIndex(\"index_name\").map {\n    case DeleteResponse.Deleted =\u003e println(\"Index successfully deleted.\")\n    case DeleteResponse.NotFound =\u003e println(\"Index with a given name not found.\")\n  }\n```\n\n- Configure index\n\n```scala\n  import io.cequence.pineconescala.domain.response.ConfigureIndexResponse\n\n  pineconeIndexService.configureIndex(\n    name = \"index_name\",\n    replicas = Some(2),\n    pod_type = Some(PodType.p1_x2)\n  ).map { \n    case ConfigureIndexResponse.Updated =\u003e println(\"Index successfully updated.\")\n    case ConfigureIndexResponse.BadRequestNotEnoughQuota =\u003e println(\"Index update failed. Not enough quota.\")\n    case ConfigureIndexResponse.NotFound =\u003e println(\"Index with a given name not found.\")\n  }\n```\n\n**Collection Operations**\n\n- List collections\n\n```scala\n  pineconeIndexService.listCollections.map(collectionNames =\u003e\n    println(collectionNames.mkString(\", \"))\n  )\n```\n\n- Create collection\n\n```scala\n  import io.cequence.pineconescala.domain.response.CreateResponse\n\n  pineconeIndexService.createCollection(\n    name = \"collection_name\",\n    source = \"index_name\"\n  ).map {\n    case CreateResponse.Created =\u003e println(\"Collection successfully created.\")\n    case CreateResponse.BadRequest =\u003e println(\"Collection creation failed. Request exceeds quota or an invalid collection name.\")\n    case CreateResponse.AlreadyExists =\u003e println(\"Collection with a given name already exists.\")\n  }\n```\n\n- Describe collection\n\n```scala\n  pineconeIndexService.describeCollection(\"collection_name\").map(collectionInfo =\u003e\n    // if not found, collectionInfo will be None\n    println(collectionInfo)\n  )\n```\n\n- Delete collection\n\n```scala\n  import io.cequence.pineconescala.domain.response.DeleteResponse\n\n  pineconeIndexService.deleteCollection(\"collection_name\").map {\n    case DeleteResponse.Deleted =\u003e println(\"Collection successfully deleted.\")\n    case DeleteResponse.NotFound =\u003e println(\"Collection with a given name not found.\")\n  }\n```\n\n**Vector Operations**\n\n- Upsert\n\n```scala\n  val dimension = 1536\n\n  pineconeVectorService.upsert(\n    vectors = Seq(\n      PVector(\n        id = \"666\",\n        values = Seq.fill(dimension)(Random.nextDouble),\n        metadata = Map(\n          \"is_relevant\" -\u003e \"not really but for testing it's ok, you know\",\n          \"food_quality\" -\u003e \"brunches are perfect but don't go there before closing time\"\n        )\n      ),\n      PVector(\n        id = \"777\",\n        values = Seq.fill(dimension)(Random.nextDouble),\n        metadata = Map(\n          \"is_relevant\" -\u003e \"very much so\",\n          \"food_quality\" -\u003e \"burritos are the best!\"\n        )\n      )\n    ),\n    namespace = \"my_namespace\",\n  ).map(vectorUpsertedCount =\u003e\n    println(s\"Upserted $vectorUpsertedCount vectors.\")\n  )\n```\n\n- Update\n\n```scala\n  val fetchedValues = ... // vectors fetched from somewhere \n\n  pineconeVectorService.update(\n    id = \"777\",\n    namespace = \"my_namespace\",\n    values = fetchedValues.map(_ / 100), // divide fetched values by 100\n    sparseValues = Some(SparseVector(\n      indices = Seq(1, 2, 3),\n      values = Seq(8.8, 7.7, 2.2)\n    )),\n    setMetaData = Map(\n      \"solid_info\" -\u003e \"this is the source of the truth\"\n    )\n  ).map(_ =\u003e\n    println(s\"Vectors updated.\")\n  )\n```\n\n- Query with default settings\n\n```scala\n  pineconeVectorService.query(\n    vector = Seq.fill(1536)(Random.nextDouble), // some values/embeddings\n    namespace = \"my_namespace\"\n  ).map { queryResponse =\u003e\n    queryResponse.matches.foreach { matchInfo =\u003e\n      println(s\"Matched vector id: ${matchInfo.id}\")\n      println(s\"Matched vector values: ${matchInfo.values.take(20).mkString(\", \")}..\")\n      println(s\"Matched vector score: ${matchInfo.score}\")\n      println(s\"Matched vector metadata: ${matchInfo.metadata}\")\n    }\n  }\n```\n\n- Query with custom settings\n\n```scala\n  pineconeVectorService.query(\n    vector = Seq.fill(1536)(Random.nextDouble), // some values/embeddings\n    namespace = \"my_namespace\",\n    settings = QuerySettings(\n      topK = 5,\n      includeValues = true,\n      includeMetadata = true\n    )\n  ).map { queryResponse =\u003e\n    queryResponse.matches.foreach { matchInfo =\u003e\n      println(s\"Matched vector id: ${matchInfo.id}\")\n      println(s\"Matched vector values: ${matchInfo.values.take(20).mkString(\", \")}..\")\n      println(s\"Matched vector score: ${matchInfo.score}\")\n      println(s\"Matched vector metadata: ${matchInfo.metadata}\")\n    }\n  }\n```\n\n- Fetch\n\n```scala\n  pineconeVectorService.fetch(\n    ids = Seq(\"666\", \"777\"),\n    namespace = \"my_namespace\"\n  ).map { fetchResponse =\u003e\n    fetchResponse.vectors.values.map { pVector =\u003e\n      println(s\"Fetched vector id: ${pVector.id}\")\n      println(s\"Fetched vector values: ${pVector.values.take(20).mkString(\", \")}..\")\n      println(s\"Fetched vector metadata: ${pVector.metadata}\")\n   }\n}\n```\n\n- Delete by id(s)\n\n```scala\n  pineconeVectorService.delete(\n    ids = Seq(\"666\", \"777\"),\n    namespace = \"my_namespace\"\n  ).map(_ =\u003e\n    println(\"Vectors deleted\")\n  )\n```\n\n- Delete all\n\n```scala\n  pineconeVectorService.deleteAll(\n    namespace = \"my_namespace\"\n  ).map(_ =\u003e\n    println(\"All vectors deleted\")\n  )\n```\n\n- Describe index stats\n\n```scala\n  pineconeVectorService.describeIndexStats.map(stats =\u003e\n    println(stats)      \n  )\n```\n\n**Inference Operations**\n\n- Generate embeddings\n\n```scala\n  pineconeInferenceService.createEmbeddings(\n    Seq(\"The quick brown fox jumped over the lazy dog\")\n  ).map { embeddings =\u003e\n    println(embeddings.data.mkString(\"\\n\"))\n  }\n```\n\n- Rerank documents / chunks\n\n```scala\n  pineconeInferenceService.rerank(\n    query = \"The tech company Apple is known for its innovative products like the iPhone.\",\n    documents = Seq(...)  \n  ).map(\n    _.data.foreach(println)\n  )\n```\n\n- Evaluate Q\u0026A\n\n```scala\n  pineconeInferenceService.evaluate(\n    question = \"What are the capital cities of France, England and Spain?\",\n    answer = \"Paris is a city of France and Barcelona of Spain\",\n    groundTruthAnswer = \"Paris is the capital city of France, London of England and Madrid of Spain\"\n  ).map { response =\u003e\n    println(response)\n  }\n```\n\n** Assistant Operations**\n\n- List assistants\n\n```scala\n  pineconeAssistantService.listAssistants.map(assistants =\u003e\n    println(assistants.mkString(\", \"))\n  )\n```\n\n- Create assistant\n\n```scala\n  import io.cequence.pineconescala.domain.response.CreateResponse\n\n  pineconeAssistantService.createAssistant(\n    name = \"assistant_name\",\n    description = \"assistant_description\",\n    assistantType = \"assistant_type\"\n  ).map {\n    case CreateResponse.Created =\u003e println(\"Assistant successfully created.\")\n    case CreateResponse.BadRequest =\u003e println(\"Assistant creation failed. Request exceeds quota or an invalid assistant name.\")\n    case CreateResponse.AlreadyExists =\u003e println(\"Assistant with a given name already exists.\")\n  }\n```\n\n- Describe assistant\n\n```scala\n  pineconeAssistantService.describeAssistant(\"assistant_name\").map(assistant =\u003e\n    // if not found, assistant will be None\n    println(assistant)\n  )\n```\n\n- Delete assistant\n\n```scala\n  import io.cequence.pineconescala.domain.response.DeleteResponse\n\n  pineconeAssistantService.deleteAssistant(\"assistant_name\").map {\n    case DeleteResponse.Deleted =\u003e println(\"Assistant successfully deleted.\")\n    case DeleteResponse.NotFound =\u003e println(\"Assistant with a given name not found.\")\n  }\n```\n\n- List assistant files\n\n```scala\n  pineconeAssistantService.listFiles(\"assistant_name\").map(files =\u003e\n    println(files.mkString(\", \"))\n  )\n```\n\n- Upload assistant file\n\n```scala\n  import io.cequence.pineconescala.domain.response.CreateResponse\n\n  pineconeAssistantService.uploadFile(\n    assistantName = \"assistant_name\",\n    filePath = \"path_to_file\"\n  ).map {\n    case CreateResponse.Created =\u003e println(\"File successfully uploaded.\")\n    case CreateResponse.BadRequest =\u003e println(\"File upload failed. Request exceeds quota or an invalid file path.\")\n    case CreateResponse.AlreadyExists =\u003e println(\"File with a given name already exists.\")\n  }\n```\n\n- Describe assistant file\n\n```scala\n  pineconeAssistantService.describeFile(\"assistant_name\", \"file_name\").map(file =\u003e\n    // if not found, file will be None\n    println(file)\n  )\n```\n\n- Chat with an assistant\n\n```scala\n  pineconeAssistantService.chatWithAssistant(\n    \"assistant_name\",\n    \"What is the maximum height of a red pine?\"\n  ).map(response =\u003e\n    println(response)\n  )\n```\n\n## Demo\n\nFor ready-to-run demos pls. refer to separate modules:\n- [Pinecone Scala Demo](https://github.com/cequence-io/pinecone-scala/tree/master/examples) - shows how to use Pinecone vector, index, and collection operations  \n- [Pinecone + OpenAI Scala Demo](https://github.com/cequence-io/pinecone-scala/tree/master/openai-examples) - shows how to generate and store OpenAI embeddings into Pinecone and query them afterwards\n\n## FAQ 🤔\n\n1. _I got a timeout exception. How can I change the timeout setting?_\n\n   You can do it either by passing the `timeouts` param to `Pinecone{Vector,Index}ServiceFactory` or, if you use your own configuration file, then you can simply add it there as: \n\n```\npinecone-scala-client {\n    timeouts {\n        requestTimeoutSec = 200\n        readTimeoutSec = 200\n        connectTimeoutSec = 5\n        pooledConnectionIdleTimeoutSec = 60\n    }\n}\n```\n\n2. _I got an exception like `com.typesafe.config.ConfigException$UnresolvedSubstitution: pinecone-scala-client.conf @ jar:file:.../io/cequence/pinecone-scala-client_2.13/1.3.3/pinecone-scala-client_2.13-1.3.3.jar!/pinecone-scala-client.conf: 4: Could not resolve substitution to a value: ${PINECONE_SCALA_CLIENT_API_KEY}`. What should I do?_\n\n   Set the env. variable `PINECONE_SCALA_CLIENT_API_KEY`. If you don't have one register [here](https://app.pinecone.io/?sessionType=signup).\n\n\n3. _It all looks cool. I want to chat with you about your research and development?_\n\n   Just shoot us an email at [pinecone-scala-client@cequence.io](mailto:pinecone-scala-client@cequence.io?subject=Research%20andDevelopment).\n\n## License ⚖️\n\nThis library is available and published as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).\n\n## Contributors 🙏\n\nThis project is open-source and welcomes any contribution or feedback ([here](https://github.com/cequence-io/pinecone-scala/issues)).\n\nDevelopment of this library has been supported by  [\u003cimg src=\"https://cequence.io/favicon-16x16.png\"\u003e - Cequence.io](https://cequence.io) - `The future of contracting` \n\nCreated and maintained by [Peter Banda](https://peterbanda.net).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcequence-io%2Fpinecone-scala","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcequence-io%2Fpinecone-scala","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcequence-io%2Fpinecone-scala/lists"}