vapi-vf / app.py
sjmt's picture
Update app.py
6050407 verified
from flask import Flask, request, jsonify
# from dotenv import load_dotenv
import requests
# import os
app = Flask(__name__)
# load_dotenv()
VOICEFLOW_URL = "https://general-runtime.voiceflow.com/state/user/userID/interact?logs=off"
# VOICEFLOW_API_KEY = os.getenv("VOICEFLOW_API_KEY")
HEADERS = {
"accept": "application/json",
"content-type": "application/json",
"Authorization": "VF.DM.665a0547ee998f43239ef780.HvLoducHeGFxik5M"
}
CONFIG = {
"tts": False,
"stripSSML": True,
"stopAll": True,
"excludeTypes": ["block", "debug", "flow"]
}
def get_nested_data(data, keys, default=None):
for key in keys:
try:
if isinstance(data, list):
data = data[key] if key < len(data) else default
else:
data = data.get(key, default)
except (AttributeError, IndexError, TypeError):
return default
if data is default:
break
return data
def interact_with_voiceflow(action_type, payload=None):
payload = {
"action": {"type": action_type, "payload": payload},
"config": CONFIG
}
response = requests.post(VOICEFLOW_URL, json=payload, headers=HEADERS)
response.raise_for_status() # Will raise an error for bad status codes
return response.json()
def process_response(response_data):
messages = set() # Use a set to avoid duplicate messages
for item in response_data:
if item['type'] == 'text':
messages.add(item['payload'].get('message', '').replace('\n', ' ').replace('**', ''))
for content_item in item['payload'].get('slate', {}).get('content', []):
for child in content_item.get('children', []):
text = child.get('text', '')
if text:
messages.add(text)
return list(messages) # Convert the set back to a list
@app.route('/')
def hello_world():
return 'Hello, World!'
@app.route('/start', methods=['POST'])
def launch():
if not request.is_json:
return jsonify({"error": "Request must be JSON"}), 400
data = request.get_json()
tool_call_id = get_nested_data(data, ["message", "toolWithToolCallList", 0, "toolCall", "id"])
user_question = get_nested_data(data, ["message", "toolWithToolCallList", 0, "toolCall", "function", "arguments", "query"])
if user_question is None:
return jsonify({"error": "Question not found in request"}), 400
print('STARTING VF...')
print('START QUESTION:', user_question)
response_data = interact_with_voiceflow("launch")
messages = process_response(response_data)
print('START VF RESPONSE:', messages)
return jsonify({"results": [{"toolCallId": tool_call_id, "result": messages}]})
@app.route('/query', methods=['POST'])
def api_call():
if not request.is_json:
return jsonify({"error": "Request must be JSON"}), 400
data = request.get_json()
tool_call_id = get_nested_data(data, ["message", "toolWithToolCallList", 0, "toolCall", "id"])
user_question = get_nested_data(data, ["message", "toolWithToolCallList", 0, "toolCall", "function", "arguments", "query"])
if user_question is None:
return jsonify({"error": "Question not found in request"}), 400
print('QUERY TO VF: ', user_question)
response_data = interact_with_voiceflow("text", user_question)
messages = process_response(response_data)
print('QUERY VF RESPONSE:', messages)
return jsonify({"results": [{"toolCallId": tool_call_id, "result": messages}]})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860, threaded=True)