Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion docs/references.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@
- [python-sounddevice](https://github.com/spatialaudio/python-sounddevice)
- [python-soundfile](https://github.com/bastibe/python-soundfile)

### Realtime API
### OpenAI

#### Realtime API

- [August 2025 / Realtime API audio model GA](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/whats-new#realtime-api-audio-model-ga)
- [Global Standard model availability](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/models?tabs=global-standard%2Cstandard-chat-completions#global-standard-model-availability)
Expand All @@ -75,3 +77,10 @@
- [GPT-4o Realtime API for speech and audio](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/realtime-audio-quickstart?tabs=keyless%2Clinux&pivots=programming-language-python)
- [OpenAI Python API library > examples/realtime](https://github.com/openai/openai-python/tree/main/examples/realtime)
- [How to use the GPT-4o Realtime API via WebRTC](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/realtime-audio-webrtc)

#### Responses API

- [OpenAI / New tools for building agents](https://openai.com/index/new-tools-for-building-agents/)
- [OpenAI / Responses](https://platform.openai.com/docs/api-reference/responses)
- [Azure OpenAI Responses API](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/responses?tabs=python-key)
- [LangChain / Responses API](https://python.langchain.com/docs/integrations/chat/openai/#responses-api)
47 changes: 47 additions & 0 deletions scripts/azure_openai_operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,53 @@ def image(
logger.info(f"Output: {response.content}")


@app.command()
def responses(
query: str = typer.Option(
"What is the weather like today?",
"--query",
"-q",
help="Query to run with the Azure OpenAI chat model",
),
stream: bool = typer.Option(
False,
"--stream",
"-s",
help="Enable streaming output",
),
verbose: bool = typer.Option(
False,
"--verbose",
"-v",
help="Enable verbose output",
),
):
set_verbose_logging(verbose)

logger.info("Running...")
llm = AzureOpenAiWrapper().responses_model

if stream:
for chunk in llm.stream(
input=[
HumanMessage(content=query),
],
):
# FIXME: Currently, just dump the whole chunk
print(chunk)
else:
response = llm.invoke(
input=query,
)
logger.debug(
response.model_dump_json(
indent=2,
exclude_none=True,
)
)
logger.info(f"Output: {response.content}")


if __name__ == "__main__":
load_dotenv(
override=True,
Expand Down
29 changes: 29 additions & 0 deletions template_langgraph/llms/azure_openais.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ def __init__(self, settings: Settings = None):
self._chat_model: AzureChatOpenAI | None = None
self._reasoning_model: AzureChatOpenAI | None = None
self._embedding_model: AzureOpenAIEmbeddings | None = None
self._responses_model: AzureChatOpenAI | None = None

def _get_auth_key(self) -> str:
"""Generate a key for authentication caching based on settings."""
Expand Down Expand Up @@ -138,6 +139,34 @@ def embedding_model(self) -> AzureOpenAIEmbeddings:
)
return self._embedding_model

@property
def responses_model(self) -> AzureChatOpenAI:
"""Lazily initialize and return responses API model."""
if self._responses_model is None:
if self.settings.azure_openai_use_microsoft_entra_id.lower() == "true":
token = self._get_auth_token()
self._responses_model = AzureChatOpenAI(
azure_ad_token=token,
azure_endpoint=self.settings.azure_openai_endpoint,
api_version=self.settings.azure_openai_api_version,
azure_deployment=self.settings.azure_openai_model_chat,
streaming=True,
model=self.settings.azure_openai_model_chat,
output_version="responses/v1",
)
else:
logger.info("Using API key for authentication")
self._responses_model = AzureChatOpenAI(
api_key=self.settings.azure_openai_api_key,
azure_endpoint=self.settings.azure_openai_endpoint,
api_version=self.settings.azure_openai_api_version,
azure_deployment=self.settings.azure_openai_model_chat,
streaming=True,
model=self.settings.azure_openai_model_chat,
output_version="responses/v1",
)
return self._responses_model

def create_embedding(self, text: str):
"""Create an embedding for the given text."""
return self.embedding_model.embed_query(text)