Skip to main content

OpenAI async API with client side timeout, retry with exponential backoff and connection reuse

Project description

OpenAI client with client timeout and parallel processing

Quick Install

pip install openai-async-client

🤔 What is this?

This library is aimed at assisting with OpenAI API usage by:

Support for client side timeouts with retry and backoff for completions.

Support for concurrent processing with pandas DataFrames.

Example of chat completion with client timeout of 1 second to connect and 10 seconds to read with a maximum of 3 retries.

import os
from httpx import Timeout
from openai_async_client import OpenAIAsync, ChatRequest, Message, SystemMessage

client = OpenAIAsync(api_key=os.environ['OPENAI_API_KEY'])

messages = [
    Message(
        role="user",
        content=f"Hello ChatGPT, Give a brief overview of the book Frankenstein by Mary Shelley.",
    )
]

response = client.chat_completion(request=ChatRequest(messages=messages),client_timeout=Timeout(1.0,read=10.0),retries=3)

Example of concurrent processing a DataFrame for chat completions with 4 concurrent connections.

import os
from httpx import Timeout
from openai_async_client import OpenAIAsync, ChatRequest, Message, SystemMessage
import uuid
import pandas as pd

[//]: # (Example DataFrame)
TEST_INPUTS = [
   "the open society and its enemies by Karl Popper",
   "Das Capital by Karl Marx",
   "Pride and Prejudice by Jane Austen",
   "Frankenstein by Mary Shelley",
   "Moby Dick by  Herman Melville",
]

records = [
   {"user_id": i, "book_id": str(uuid.uuid4())[:6], "book_name": s}
   for i, s in enumerate(TEST_INPUTS)
]
input_df = pd.DataFrame.from_records(records)


client = OpenAIAsync(api_key=os.environ['OPENAI_API_KEY'])

[//]: # (Define a mapping function from row to prompt)
def my_prompt_fn(r: pd.Series) -> ChatRequest:
   message = Message(
       role="user",
       content=f"Hello ChatGPT, Give a brief overview of the book {r.book_name}.",
   )

[//]: # (key Dict is mandatory since results order is NOT guaranteed!)
   key = {"user_id": r.user_id, "book_id": r.book_id}
   return ChatRequest(
       key=key,
       messages=[message],
       system=SystemMessage(content="Assistant is providing book reviews"),
   )

[//]: # (parallel process the DataFrame making up to 4 concurrent requests to OpenAI endpoint)
result_df = client.chat_completions(df=input_df, request_fn=my_prompt_fn,max_connections=4)

[//]: # (result_df columns contains 'openai_reply' and 'api_error' columns.

Default Response Extraction

By default, only the "assistant" message (or messages if n>1) would be returned, but you can implement a custom ResponseProcessor

class ResponseProcessor(Generic[R], Callable[..., R], ABC):
    @abstractmethod
    def __call__(self, json: str, *args: Any, **kwargs: Any) -> R:
        pass

Disclaimer

This repository has no connection whatsoever to OpenAI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

openai-async-client-0.2.0.tar.gz (5.9 kB view details)

Uploaded Source

Built Distribution

openai_async_client-0.2.0-py3-none-any.whl (16.7 kB view details)

Uploaded Python 3

File details

Details for the file openai-async-client-0.2.0.tar.gz.

File metadata

  • Download URL: openai-async-client-0.2.0.tar.gz
  • Upload date:
  • Size: 5.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.16

File hashes

Hashes for openai-async-client-0.2.0.tar.gz
Algorithm Hash digest
SHA256 f69cef24345ac3a7a8b39ca3051552115a38c7b0ea91dca54a0bd5353e4109bb
MD5 9473be7970edcbafe5ffbf46cc48fcf0
BLAKE2b-256 c6aef8b6a389e31dd2b589c9af230865514191cfcde762333563a65a24d02e2f

See more details on using hashes here.

File details

Details for the file openai_async_client-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for openai_async_client-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dc4e98613652bb3f205ed497c40a2c2fbc9604db2ea4cde5fd3b31f8bf976a07
MD5 bbdcf76c709875e2d471c324bfbcce9f
BLAKE2b-256 30b5d7cd895f7d18bf467f332e47a8b69acc9af3f54a99285974edf680debf24

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page