35c9fb2445
CI Pipeline / code-quality (push) Waiting to run
CI Pipeline / test (macos-latest, 3.10) (push) Blocked by required conditions
CI Pipeline / test (macos-latest, 3.11) (push) Blocked by required conditions
CI Pipeline / test (macos-latest, 3.12) (push) Blocked by required conditions
CI Pipeline / test (macos-latest, 3.13) (push) Blocked by required conditions
CI Pipeline / test (ubuntu-latest, 3.10) (push) Blocked by required conditions
CI Pipeline / test (ubuntu-latest, 3.11) (push) Blocked by required conditions
CI Pipeline / test (ubuntu-latest, 3.12) (push) Blocked by required conditions
CI Pipeline / test (ubuntu-latest, 3.13) (push) Blocked by required conditions
CI Pipeline / test (windows-latest, 3.10) (push) Blocked by required conditions
CI Pipeline / test (windows-latest, 3.11) (push) Blocked by required conditions
CI Pipeline / test (windows-latest, 3.12) (push) Blocked by required conditions
CI Pipeline / test (windows-latest, 3.13) (push) Blocked by required conditions
535 lines
16 KiB
Python
535 lines
16 KiB
Python
import sys
|
|
import os
|
|
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')))
|
|
|
|
from openai import OpenAI, AsyncOpenAI, AzureOpenAI, AsyncAzureOpenAI
|
|
import vertexai
|
|
from vertexai.generative_models import GenerativeModel, GenerationConfig
|
|
import google.generativeai as genai
|
|
from litellm import completion, acompletion
|
|
import litellm
|
|
import anthropic
|
|
from anthropic import Anthropic, AsyncAnthropic
|
|
from langchain_google_genai import ChatGoogleGenerativeAI
|
|
from langchain_google_vertexai import ChatVertexAI
|
|
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
|
|
from groq import Groq, AsyncGroq
|
|
|
|
from ragaai_catalyst import trace_llm
|
|
|
|
from dotenv import load_dotenv
|
|
load_dotenv()
|
|
|
|
# Azure OpenAI setup
|
|
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
|
|
azure_api_key = os.getenv("AZURE_OPENAI_API_KEY")
|
|
azure_api_version = os.getenv("AZURE_OPENAI_API_VERSION", "2024-08-01-preview")
|
|
|
|
# Google AI setup
|
|
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
|
|
|
|
# Vertex AI setup
|
|
vertexai.init(project="gen-lang-client-0655603261", location="us-central1")
|
|
|
|
async def get_llm_response(
|
|
prompt,
|
|
model,
|
|
provider,
|
|
temperature,
|
|
max_tokens,
|
|
async_llm=False,
|
|
):
|
|
"""
|
|
Main interface for getting responses from various LLM providers
|
|
"""
|
|
if 'azure' in provider.lower():
|
|
if async_llm:
|
|
async_azure_openai_client = AsyncAzureOpenAI(azure_endpoint=azure_endpoint, api_key=azure_api_key, api_version=azure_api_version)
|
|
return await _get_async_azure_openai_response(async_azure_openai_client, prompt, model, temperature, max_tokens)
|
|
else:
|
|
azure_openai_client = AzureOpenAI(azure_endpoint=azure_endpoint, api_key=azure_api_key, api_version=azure_api_version)
|
|
return _get_azure_openai_response(azure_openai_client, prompt, model, temperature, max_tokens)
|
|
elif 'openai_beta' in provider.lower():
|
|
openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
|
|
return _get_openai_beta_response(openai_client, prompt, model, temperature, max_tokens)
|
|
elif 'openai' in provider.lower():
|
|
if async_llm:
|
|
async_openai_client = AsyncOpenAI(api_key=os.getenv("OPENAI_API_KEY"))
|
|
return await _get_async_openai_response(async_openai_client, prompt, model, temperature, max_tokens)
|
|
else:
|
|
openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
|
|
return _get_openai_response(openai_client, prompt, model, temperature, max_tokens)
|
|
elif 'chat_google' in provider.lower():
|
|
if async_llm:
|
|
return await _get_async_chat_google_generativeai_response(prompt, model, temperature, max_tokens)
|
|
else:
|
|
return _get_chat_google_generativeai_response(prompt, model, temperature, max_tokens)
|
|
elif 'google' in provider.lower():
|
|
if async_llm:
|
|
return await _get_async_google_generativeai_response(prompt, model, temperature, max_tokens)
|
|
else:
|
|
return _get_google_generativeai_response(prompt, model, temperature, max_tokens)
|
|
elif 'chat_vertexai' in provider.lower():
|
|
if async_llm:
|
|
return await _get_async_chat_vertexai_response(prompt, model, temperature, max_tokens)
|
|
else:
|
|
return _get_chat_vertexai_response(prompt, model, temperature, max_tokens)
|
|
elif 'vertexai' in provider.lower():
|
|
if async_llm:
|
|
return await _get_async_vertexai_response(prompt, model, temperature, max_tokens)
|
|
else:
|
|
return _get_vertexai_response(prompt, model, temperature, max_tokens)
|
|
elif 'anthropic' in provider.lower():
|
|
if async_llm:
|
|
async_anthropic_client = AsyncAnthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
|
|
return await _get_async_anthropic_response(async_anthropic_client, prompt, model, temperature, max_tokens)
|
|
else:
|
|
anthropic_client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
|
|
return _get_anthropic_response(anthropic_client, prompt, model, temperature, max_tokens)
|
|
elif 'groq' in provider.lower():
|
|
if async_llm:
|
|
async_groq_client = AsyncGroq(api_key=os.getenv("GROQ_API_KEY"))
|
|
return await _get_async_groq_response(async_groq_client, prompt, model, temperature, max_tokens)
|
|
else:
|
|
groq_client = Groq(api_key=os.getenv("GROQ_API_KEY"))
|
|
return _get_groq_response(groq_client, prompt, model, temperature, max_tokens)
|
|
elif 'litellm' in provider.lower():
|
|
if async_llm:
|
|
return await _get_async_litellm_response(prompt, model, temperature, max_tokens)
|
|
else:
|
|
return _get_litellm_response(prompt, model, temperature, max_tokens)
|
|
|
|
|
|
@trace_llm(name="_get_openai_response")
|
|
def _get_openai_response(
|
|
openai_client,
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens,
|
|
):
|
|
"""
|
|
Get response from OpenAI API
|
|
"""
|
|
try:
|
|
response = openai_client.chat.completions.create(
|
|
model=model,
|
|
messages=[{"role": "user", "content": prompt}],
|
|
temperature=temperature,
|
|
max_tokens=max_tokens
|
|
)
|
|
return response.choices[0].message.content
|
|
except Exception as e:
|
|
print(f"Error with OpenAI API: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_async_openai_response")
|
|
async def _get_async_openai_response(
|
|
async_openai_client,
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens,
|
|
):
|
|
"""
|
|
Get async response from OpenAI API
|
|
"""
|
|
try:
|
|
response = await async_openai_client.chat.completions.create(
|
|
model=model,
|
|
messages=[{"role": "user", "content": prompt}],
|
|
temperature=temperature,
|
|
max_tokens=max_tokens
|
|
)
|
|
return response.choices[0].message.content
|
|
except Exception as e:
|
|
print(f"Error with async OpenAI API: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_openai_beta_response")
|
|
def _get_openai_beta_response(
|
|
openai_client,
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
assistant = openai_client.beta.assistants.create(model=model)
|
|
thread = openai_client.beta.threads.create()
|
|
message = openai_client.beta.threads.messages.create(
|
|
thread_id=thread.id,
|
|
role="user",
|
|
content=prompt
|
|
)
|
|
run = openai_client.beta.threads.runs.create_and_poll(
|
|
thread_id=thread.id,
|
|
assistant_id=assistant.id,
|
|
temperature=temperature,
|
|
max_completion_tokens=max_tokens
|
|
)
|
|
if run.status == 'completed':
|
|
messages = openai_client.beta.threads.messages.list(thread_id=thread.id)
|
|
return messages.data[0].content[0].text.value
|
|
|
|
@trace_llm(name="_get_azure_openai_response")
|
|
def _get_azure_openai_response(
|
|
azure_openai_client,
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
"""
|
|
Get response from Azure OpenAI API
|
|
"""
|
|
try:
|
|
response = azure_openai_client.chat.completions.create(
|
|
model=model,
|
|
messages=[{"role": "user", "content": prompt}],
|
|
temperature=temperature,
|
|
max_tokens=max_tokens
|
|
)
|
|
return response.choices[0].message.content
|
|
except Exception as e:
|
|
print(f"Error with Azure OpenAI API: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_async_azure_openai_response")
|
|
async def _get_async_azure_openai_response(
|
|
async_azure_openai_client,
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
"""
|
|
Get async response from Azure OpenAI API
|
|
"""
|
|
try:
|
|
response = await async_azure_openai_client.chat.completions.create(
|
|
model=model,
|
|
messages=[{"role": "user", "content": prompt}],
|
|
temperature=temperature,
|
|
max_tokens=max_tokens
|
|
)
|
|
return response.choices[0].message.content
|
|
except Exception as e:
|
|
print(f"Error with async Azure OpenAI API: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_litellm_response")
|
|
def _get_litellm_response(
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
"""
|
|
Get response using LiteLLM
|
|
"""
|
|
try:
|
|
response = completion(
|
|
model=model,
|
|
messages=[{"role": "user", "content": prompt}],
|
|
temperature=temperature,
|
|
max_tokens=max_tokens
|
|
)
|
|
return response.choices[0].message.content
|
|
except Exception as e:
|
|
print(f"Error with LiteLLM: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_async_litellm_response")
|
|
async def _get_async_litellm_response(
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
"""
|
|
Get async response using LiteLLM
|
|
"""
|
|
try:
|
|
response = await acompletion(
|
|
model=model,
|
|
messages=[{"role": "user", "content": prompt}],
|
|
temperature=temperature,
|
|
max_tokens=max_tokens
|
|
)
|
|
return response.choices[0].message.content
|
|
except Exception as e:
|
|
print(f"Error with async LiteLLM: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_vertexai_response")
|
|
def _get_vertexai_response(
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
"""
|
|
Get response from VertexAI
|
|
"""
|
|
try:
|
|
# vertexai.init(project="gen-lang-client-0655603261", location="us-central1")
|
|
model = GenerativeModel(
|
|
model_name=model
|
|
)
|
|
response = model.generate_content(
|
|
prompt,
|
|
generation_config=GenerationConfig(
|
|
temperature=temperature,
|
|
max_output_tokens=max_tokens
|
|
)
|
|
)
|
|
return response.text
|
|
except Exception as e:
|
|
print(f"Error with VertexAI: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_async_vertexai_response")
|
|
async def _get_async_vertexai_response(
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
"""
|
|
Get async response from VertexAI
|
|
"""
|
|
try:
|
|
model = GenerativeModel(
|
|
model_name=model
|
|
)
|
|
response = await model.generate_content_async(
|
|
prompt,
|
|
generation_config=GenerationConfig(
|
|
temperature=temperature,
|
|
max_output_tokens=max_tokens
|
|
)
|
|
)
|
|
return response.text
|
|
except Exception as e:
|
|
print(f"Error with async VertexAI: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_google_generativeai_response")
|
|
def _get_google_generativeai_response(
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
"""
|
|
Get response from Google GenerativeAI
|
|
"""
|
|
try:
|
|
model = genai.GenerativeModel(model)
|
|
response = model.generate_content(
|
|
prompt,
|
|
generation_config=genai.GenerationConfig(
|
|
temperature=temperature,
|
|
max_output_tokens=max_tokens
|
|
)
|
|
)
|
|
return response.text
|
|
except Exception as e:
|
|
print(f"Error with Google GenerativeAI: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_async_google_generativeai_response")
|
|
async def _get_async_google_generativeai_response(
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
"""
|
|
Get async response from Google GenerativeAI
|
|
"""
|
|
try:
|
|
model = genai.GenerativeModel(model)
|
|
response = await model.generate_content_async(
|
|
prompt,
|
|
generation_config=genai.GenerationConfig(
|
|
temperature=temperature,
|
|
max_output_tokens=max_tokens
|
|
)
|
|
)
|
|
return response.text
|
|
except Exception as e:
|
|
print(f"Error with async Google GenerativeAI: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_anthropic_response")
|
|
def _get_anthropic_response(
|
|
anthropic_client,
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens,
|
|
):
|
|
try:
|
|
response = anthropic_client.messages.create(
|
|
model=model,
|
|
messages=[{"role": "user", "content": prompt}],
|
|
temperature=temperature,
|
|
max_tokens=max_tokens
|
|
)
|
|
return response.content[0].text
|
|
except Exception as e:
|
|
print(f"Error with Anthropic: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_async_anthropic_response")
|
|
async def _get_async_anthropic_response(
|
|
async_anthropic_client,
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens,
|
|
):
|
|
try:
|
|
response = await async_anthropic_client.messages.create(
|
|
model=model,
|
|
messages=[{"role": "user", "content": prompt}],
|
|
temperature=temperature,
|
|
max_tokens=max_tokens
|
|
)
|
|
return response.content[0].text
|
|
except Exception as e:
|
|
print(f"Error with async Anthropic: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_chat_google_generativeai_response")
|
|
def _get_chat_google_generativeai_response(
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
try:
|
|
model = ChatGoogleGenerativeAI(model=model)
|
|
response = model._generate(
|
|
[HumanMessage(content=prompt)],
|
|
generation_config=dict(
|
|
temperature=temperature,
|
|
max_output_tokens=max_tokens
|
|
)
|
|
)
|
|
return response.generations[0].text
|
|
except Exception as e:
|
|
print(f"Error with Google GenerativeAI: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_async_chat_google_generativeai_response")
|
|
async def _get_async_chat_google_generativeai_response(
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
try:
|
|
model = ChatGoogleGenerativeAI(model=model)
|
|
response = await model._agenerate(
|
|
[HumanMessage(content=prompt)],
|
|
generation_config=dict(
|
|
temperature=temperature,
|
|
max_output_tokens=max_tokens
|
|
)
|
|
)
|
|
return response.generations[0].text
|
|
except Exception as e:
|
|
print(f"Error with async Google GenerativeAI: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_chat_vertexai_response")
|
|
def _get_chat_vertexai_response(
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
try:
|
|
model = ChatVertexAI(
|
|
model=model,
|
|
google_api_key=os.getenv("GOOGLE_API_KEY")
|
|
)
|
|
response = model._generate(
|
|
[HumanMessage(content=prompt)],
|
|
generation_config=dict(
|
|
temperature=temperature,
|
|
max_output_tokens=max_tokens
|
|
)
|
|
)
|
|
return response.generations[0].text
|
|
except Exception as e:
|
|
print(f"Error with VertexAI: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_async_chat_vertexai_response")
|
|
async def _get_async_chat_vertexai_response(
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
try:
|
|
model = ChatVertexAI(
|
|
model=model,
|
|
google_api_key=os.getenv("GOOGLE_API_KEY")
|
|
)
|
|
response = await model._agenerate(
|
|
[HumanMessage(content=prompt)],
|
|
generation_config=dict(
|
|
temperature=temperature,
|
|
max_output_tokens=max_tokens
|
|
)
|
|
)
|
|
return response.generations[0].text
|
|
except Exception as e:
|
|
print(f"Error with async VertexAI: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_groq_response")
|
|
def _get_groq_response(
|
|
groq_client,
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
try:
|
|
response = groq_client.chat.completions.create(
|
|
model=model,
|
|
messages=[{"role": "user", "content": prompt}],
|
|
temperature=temperature,
|
|
max_tokens=max_tokens
|
|
)
|
|
return response.choices[0].message.content
|
|
except Exception as e:
|
|
print(f"Error with Groq: {str(e)}")
|
|
return None
|
|
|
|
@trace_llm(name="_get_async_groq_response")
|
|
async def _get_async_groq_response(
|
|
async_groq_client,
|
|
prompt,
|
|
model,
|
|
temperature,
|
|
max_tokens
|
|
):
|
|
try:
|
|
response = await async_groq_client.chat.completions.create(
|
|
model=model,
|
|
messages=[{"role": "user", "content": prompt}],
|
|
temperature=temperature,
|
|
max_tokens=max_tokens
|
|
)
|
|
return response.choices[0].message.content
|
|
except Exception as e:
|
|
print(f"Error with async Groq: {str(e)}")
|
|
return None
|
|
|