zaldivards's picture
Add functions to invoke Bedrock and OpenAI models
694a9b2
import os
import json
from io import BytesIO
import boto3
import requests
from openai import OpenAI
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
BEDROCK_MODEL_ID = "anthropic.claude-3-5-sonnet-20240620-v1:0"
OPENAI_MODEL_ID = "o4-mini"
OPENAI_MODEL_IMAGE_MODEL_ID = "gpt-4.1-mini"
bedrock_runtime = boto3.client("bedrock-runtime", region_name=os.getenv("AWS_REGION"))
openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def invoke_bedrock_model(messages: list[dict]) -> str:
"""Invokes a Bedrock model with the provided messages."""
response = bedrock_runtime.invoke_model(
modelId=BEDROCK_MODEL_ID,
body=json.dumps({"anthropic_version": "bedrock-2023-05-31", "max_tokens": 4096, "messages": messages}),
)["body"].read()
return json.loads(response)["content"][0]["text"]
def invoke_openai_model(messages: list[dict]) -> str:
"""Invokes an OpenAI model with the provided messages."""
response = openai_client.responses.create(
model=OPENAI_MODEL_IMAGE_MODEL_ID,
input=messages,
)
return response.output_text
def get_file(task_id: str) -> BytesIO:
"""Fetches a file associated with a task ID from the default API URL.
Parameters
----------
task_id : str
The ID of the task for which the file is to be fetched.
Returns
-------
BytesIO
A BytesIO object containing the file content.
Raises
------
requests.exceptions.RequestException
If there is an error during the HTTP request.
Exception
For any other unexpected errors that may occur.
"""
url = f"{DEFAULT_API_URL}/files/{task_id}"
try:
response = requests.get(url, timeout=15)
response.raise_for_status()
return BytesIO(response.content)
except requests.exceptions.RequestException as e:
print(f"Error fetching file for task {task_id}: {e}")
raise
except Exception as e:
print(f"An unexpected error occurred fetching file for task {task_id}: {e}")
raise
def s3_upload_file(file_content: BytesIO, bucket_name: str, object_name: str) -> None:
"""Uploads a file to an S3 bucket.
Parameters
----------
file_content : BytesIO
The content of the file to upload.
bucket_name : str
The name of the S3 bucket.
object_name : str
The name of the object in the S3 bucket.
Raises
------
Exception
If there is an error during the upload process.
"""
try:
s3_client = boto3.client("s3")
s3_client.put_object(Bucket=bucket_name, Key=object_name, Body=file_content.getvalue())
except Exception as e:
print(f"Error uploading file to S3: {e}")
raise
def s3_download_file(bucket_name: str, object_name: str) -> BytesIO:
"""Downloads a file from an S3 bucket.
Parameters
----------
bucket_name : str
The name of the S3 bucket.
object_name : str
The name of the object in the S3 bucket.
Returns
-------
BytesIO
A BytesIO object containing the downloaded file content.
Raises
------
Exception
If there is an error during the download process.
"""
try:
s3_client = boto3.client("s3")
response = s3_client.get_object(Bucket=bucket_name, Key=object_name)
return BytesIO(response["Body"].read())
except Exception as e:
print(f"Error downloading file from S3: {e}")
raise