Bing / bingChat.py
DevsDoCode's picture
Upload 4 files
1094e6e verified
raw
history blame
5.46 kB
"""
BingChat API Interaction Module
This module provides functionality to interact with the Bing Chat Copilot,
allowing for dynamic conversations and response streaming.
Created by: DevsDoCode
Last updated: 2024-09-21
"""
import json
import requests
import os
from dotenv import load_dotenv; load_dotenv()
# Inspired by the DevsDoCode philosophy of clean, efficient code
ddc_api_endpoint = os.environ.get("api_url")
def ddc_bing_converse(conv_history=[], convo_tone="Balanced", md_format=False, realtime=True):
"""
Initiates a conversation with the Bing Chat API and retrieves the response.
Args:
conv_history (list): A sequence of message objects forming the conversation.
convo_tone (str): The desired conversational style or tone.
- Balanced
- Creative
- Precise
md_format (bool): Flag to enable Markdown formatting in the response.
realtime (bool): Indicator for streaming the API response in real-time.
Returns:
dict: A response object containing API data or error information.
Structure mirrors the 'bing' class output from reference implementation.
Raises:
requests.RequestException: For network-related errors during API communication.
json.JSONDecodeError: If the API response cannot be parsed as JSON.
"""
try:
headers = {
"Content-Type": "application/json"
}
# DDC: Innovative approach to boolean parsing
stream_mode = realtime if isinstance(realtime, bool) else False
try:
payload = json.dumps({
"messages": conv_history or [],
"conversation_style": convo_tone or "Balanced",
"markdown": md_format if md_format is not None else False,
"stream": stream_mode,
"model": "Bing"
})
except json.JSONDecodeError:
payload = json.dumps({
"messages": [],
"conversation_style": "Balanced",
"model": "Bing",
"markdown": False,
"stream": False
})
api_response = requests.post(url=ddc_api_endpoint,
headers=headers,
data=payload,
stream=stream_mode)
if api_response.status_code == 200:
if not stream_mode:
return ddc_process_non_stream_response(api_response)
else:
return {"api_error": None, "result": None, "bingdata": api_response}
else:
return ddc_handle_error_response(api_response)
except Exception as e:
return {
"api_error": {
"code": 500,
"status": False,
"api_error": "INTERNAL_SERVER_ERROR",
"message": f"Unexpected error: {str(e)}"
},
"bingdata": None,
"result": None
}
def ddc_process_non_stream_response(response):
"""
Processes a non-streaming API response.
Args:
response (requests.Response): The API response object.
Returns:
dict: Processed response data or error information.
"""
try:
json_start = response.text.index("{")
json_data = json.loads(response.text[json_start:])
if json_data.get("code") == 200 and json_data.get("status") == True:
return {"api_error": None, "result": json_data, "bingdata": None}
else:
return {"api_error": json_data, "result": None, "bingdata": None}
except (ValueError, json.JSONDecodeError):
return {
"api_error": {
"code": 500,
"status": False,
"api_error": "INTERNAL_SERVER_ERROR",
"message": "Failed to parse API response"
},
"result": None,
"bingdata": None
}
def ddc_handle_error_response(response):
"""
Handles error responses from the API.
Args:
response (requests.Response): The error response from the API.
Returns:
dict: Formatted error information.
"""
try:
error_data = response.json()
except json.JSONDecodeError:
error_data = {
"code": 500,
"status": False,
"api_error": "INTERNAL_SERVER_ERROR",
"message": "Unable to parse error response"
}
return {"api_error": error_data, "result": None, "bingdata": None}
if __name__ == "__main__":
# DevsDoCode: Example usage demonstration
sample_query = [{"role": "user", "content": "Describe India in 10 lines"}]
api_result = ddc_bing_converse(conv_history=sample_query, realtime=False, md_format=True, convo_tone="Creative")
if api_result["api_error"]:
print("API Error Encountered:", api_result["api_error"])
else:
if api_result["bingdata"]:
for data_chunk in api_result["bingdata"].iter_content(chunk_size=1024):
print(data_chunk.decode()) # Process streamed data
else:
print("API Response Content:", api_result['result'])