diff --git a/pyproject.toml b/pyproject.toml index 3c5d6262b..c5b1ba28a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,8 @@ dependencies = [ "pydantic~=2.10.5", "pyloudnorm~=0.1.1", "resampy~=0.4.3", - "soxr~=0.5.0" + "soxr~=0.5.0", + "openai~=1.59.6" ] [project.urls] @@ -69,7 +70,7 @@ local = [ "pyaudio~=0.2.14" ] moondream = [ "einops~=0.8.0", "timm~=1.0.13", "transformers~=4.48.0" ] nim = [ "openai~=1.59.6" ] noisereduce = [ "noisereduce~=3.0.3" ] -openai = [ "openai~=1.59.6", "websockets~=13.1", "python-deepcompare~=2.1.0" ] +openai = [ "openai~=1.59.6", "websockets~=13.1" ] openpipe = [ "openpipe~=4.45.0" ] perplexity = [ "openai~=1.59.6" ] playht = [ "pyht~=0.1.6", "websockets~=13.1" ] diff --git a/src/pipecat/processors/aggregators/openai_llm_context.py b/src/pipecat/processors/aggregators/openai_llm_context.py index cc14c5ac7..5ef8c090f 100644 --- a/src/pipecat/processors/aggregators/openai_llm_context.py +++ b/src/pipecat/processors/aggregators/openai_llm_context.py @@ -12,6 +12,12 @@ from dataclasses import dataclass from typing import Any, Awaitable, Callable, List, Optional from loguru import logger +from openai._types import NOT_GIVEN, NotGiven +from openai.types.chat import ( + ChatCompletionMessageParam, + ChatCompletionToolChoiceOptionParam, + ChatCompletionToolParam, +) from PIL import Image from pipecat.frames.frames import ( @@ -22,20 +28,6 @@ from pipecat.frames.frames import ( ) from pipecat.processors.frame_processor import FrameDirection, FrameProcessor -try: - from openai._types import NOT_GIVEN, NotGiven - from openai.types.chat import ( - ChatCompletionMessageParam, - ChatCompletionToolChoiceOptionParam, - ChatCompletionToolParam, - ) -except ModuleNotFoundError as e: - logger.error(f"Exception: {e}") - logger.error( - "In order to use OpenAI, you need to `pip install pipecat-ai[openai]`. Also, set `OPENAI_API_KEY` environment variable." - ) - raise Exception(f"Missing module: {e}") - # JSON custom encoder to handle bytes arrays so that we can log contexts # with images to the console. diff --git a/src/pipecat/services/base_whisper.py b/src/pipecat/services/base_whisper.py index eae38be64..4de62f08c 100644 --- a/src/pipecat/services/base_whisper.py +++ b/src/pipecat/services/base_whisper.py @@ -7,22 +7,14 @@ from typing import AsyncGenerator, Optional from loguru import logger +from openai import AsyncOpenAI +from openai.types.audio import Transcription from pipecat.frames.frames import ErrorFrame, Frame, TranscriptionFrame from pipecat.services.ai_services import SegmentedSTTService from pipecat.transcriptions.language import Language from pipecat.utils.time import time_now_iso8601 -try: - from openai import AsyncOpenAI - from openai.types.audio import Transcription -except ModuleNotFoundError as e: - logger.error(f"Exception: {e}") - logger.error( - "In order to use OpenAI, you need to `pip install pipecat-ai[openai]`. Also, set `OPENAI_API_KEY` environment variable." - ) - raise Exception(f"Missing module: {e}") - def language_to_whisper_language(language: Language) -> Optional[str]: """Language support for Whisper API. diff --git a/src/pipecat/services/openai.py b/src/pipecat/services/openai.py index 4077f4354..8c2b7359b 100644 --- a/src/pipecat/services/openai.py +++ b/src/pipecat/services/openai.py @@ -13,6 +13,14 @@ from typing import Any, AsyncGenerator, Dict, List, Literal, Optional import aiohttp import httpx from loguru import logger +from openai import ( + NOT_GIVEN, + AsyncOpenAI, + AsyncStream, + BadRequestError, + DefaultAsyncHttpxClient, +) +from openai.types.chat import ChatCompletionChunk, ChatCompletionMessageParam from PIL import Image from pydantic import BaseModel, Field @@ -57,23 +65,6 @@ from pipecat.services.base_whisper import BaseWhisperSTTService, Transcription from pipecat.transcriptions.language import Language from pipecat.utils.time import time_now_iso8601 -try: - from openai import ( - NOT_GIVEN, - AsyncOpenAI, - AsyncStream, - BadRequestError, - DefaultAsyncHttpxClient, - ) - from openai.types.chat import ChatCompletionChunk, ChatCompletionMessageParam -except ModuleNotFoundError as e: - logger.error(f"Exception: {e}") - logger.error( - "In order to use OpenAI, you need to `pip install pipecat-ai[openai]`. Also, set `OPENAI_API_KEY` environment variable." - ) - raise Exception(f"Missing module: {e}") - - ValidVoice = Literal["alloy", "echo", "fable", "onyx", "nova", "shimmer"] VALID_VOICES: Dict[str, ValidVoice] = { diff --git a/src/pipecat/services/openai_realtime_beta/openai.py b/src/pipecat/services/openai_realtime_beta/openai.py index bc173d765..ff6f24c66 100644 --- a/src/pipecat/services/openai_realtime_beta/openai.py +++ b/src/pipecat/services/openai_realtime_beta/openai.py @@ -10,9 +10,17 @@ import json import time from dataclasses import dataclass -import websockets from loguru import logger +try: + import websockets +except ModuleNotFoundError as e: + logger.error(f"Exception: {e}") + logger.error( + "In order to use OpenAI, you need to `pip install pipecat-ai[openai]`. Also, set `OPENAI_API_KEY` environment variable." + ) + raise Exception(f"Missing module: {e}") + from pipecat.frames.frames import ( BotStoppedSpeakingFrame, CancelFrame,