Take Dialogflow intent and query Firestore

独自空忆成欢 提交于 2019-12-10 19:43:32

问题


My chatbot has been created in Dialogflow and I am now trying to access it from Python, to take user inputs and display outputs in the GUI (think a basic chatbot gui).

I have connected my Python environment to Dialogflow and to firestore,

Here is the code that detects intents;

#Detection of Dialogflow intents, project and input.
def detect_intent_texts(project_id, session_id, texts, language_code):
   #Returns the result of detect intent with texts as inputs, later can implement same `session_id` between requests allows continuation of the conversaion.
    import dialogflow_v2 as dialogflow
    session_client = dialogflow.SessionsClient()

    session = session_client.session_path(project_id, session_id)
#To ensure session path is correct - print('Session path: {}\n'.format(session))

    for text in texts:
        text_input = dialogflow.types.TextInput(text=text, language_code=language_code)
        query_input = dialogflow.types.QueryInput(text=text_input)
        response = session_client.detect_intent(session=session, query_input=query_input)

        print ('Chatbot:{}\n'.format(response.query_result.fulfillment_text))
detect_intent_texts("chat-8","abc",["Hey"],"en-us")

I need to somehow say if THIS intent is triggered, get something from the db and display to user.

UPDATE

My current code in full, everything is looking right to me but it's throwing an error I don't understand, thanks to Sid8491 for the help so far.

in short, my issue is, my previous code allowed me to type something and the chatbot respond, it was all in the console but it worked... The new code is supposed to allow me to say "When THIS intent is triggered, do THIS"

import os, json
import sys
import dialogflow
from dialogflow_v2beta1 import *
import firebase_admin
import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()
from firebase_admin import firestore
from firebase_admin import credentials
import requests.packages.urllib3
from Tkinter import *
from dialogflow_v2beta1 import agents_client
import Tkinter as tk
result = None
window = Tk()

def Response():
    #no need to use global here
    result = myText.get()
    displayText.configure(state='normal')
    displayText.insert(END, "User:"+ result + '\n')
    displayText.configure(state='disabled')

#Creating the GUI
myText = tk.StringVar()
window.resizable(False, False)
window.title("Chatbot")
window.geometry('400x400')
User_Input = tk.Entry(window, textvariable=myText, width=50).place(x=20, y=350)
subButton = tk.Button(window, text="Send", command=Response).place(x =350, y=350)
displayText = Text(window, height=20, width=40)
displayText.pack()
scroll = Scrollbar(window, command=displayText).pack(side=RIGHT)
window.mainloop()

#Initialize the firebase admin SDK
cred = credentials.Certificate('./file.json')
default_app = firebase_admin.initialize_app(cred)
db = firestore.client()

def getCourse():
    doc_ref = db.collection(u"Course_Information").document(u"CourseTypes")
    try:
        doc = doc_ref.get()
        return 'Document data: {}'.format(doc.to_dict())
    except google.cloud.exceptions.NotFound:
        return 'Not found'

def detect_intent_text(project_id, session_id, text, language_code):
    GOOGLE_APPLICATION_CREDENTIALS=".chat-8.json"
    session_client = dialogflow.SessionsClient(GOOGLE_APPLICATION_CREDENTIALS)

    session = session_client.session_path(project_id, session_id)

    text_input = dialogflow.types.TextInput(
        text=text, language_code=language_code)

    query_input = dialogflow.types.QueryInput(text=text_input)

    response = session_client.detect_intent(
        session=session, query_input=query_input)

queryText = [myText.get()]

res = detect_intent_text('chat-8', 'session-test', queryText, 'en')
intentName = res['query_result']['intent']['display_name']

if intentName == 'CourseEnquiry':
    reponse = getCourse()
    print json.dumps({
        'fulfillmentText': reponse,
    })
elif intentName == 'Greetings':
    print "Yo"

detect_intent_texts("chat-8","abc", queryText,"en-us")

But I get this error:

C:\Users\chat\PycharmProjects\Chatbot\venv\Scripts\python.exe C:/Users/chat/PycharmProjects/Chatbot/venv/Chatbot.py
Traceback (most recent call last):
  File "C:/Users/chat/PycharmProjects/Chatbot/venv/Chatbot.py", line 65, in <module>
    res = detect_intent_text('chat-8', 'session-test', queryText, 'en')
  File "C:/Users/chat/PycharmProjects/Chatbot/venv/Chatbot.py", line 51, in detect_intent_text
    session_client = dialogflow.SessionsClient(GOOGLE_APPLICATION_CREDENTIALS)
  File "C:\Users\chat\PycharmProjects\Chatbot\venv\lib\site-packages\dialogflow_v2\gapic\sessions_client.py", line 109, in __init__
    self.sessions_stub = (session_pb2.SessionsStub(channel))
  File "C:\Users\chat\PycharmProjects\Chatbot\venv\lib\site-packages\dialogflow_v2\proto\session_pb2.py", line 1248, in __init__
    self.DetectIntent = channel.unary_unary(
AttributeError: 'str' object has no attribute 'unary_unary'

Process finished with exit code 1

回答1:


Yes, I think you are on the right track.

You need to extract intentName or actionaName from the response you got from the dialogFlow and call your corresponding functions and then send the response back to user.

res = detect_intent_texts("chat-8","abc",["Hey"],"en-us")
action = res['queryResult']['action']

if action == 'getSomethingFromDb':
    reponse = someFunction(req)
    return json.dumps({
        'fulfillmentText': reponse,
    })
elif action == 'somethingElse':
    ....

If you want it to do using intentName instead of actionName then you can extract intentName like below

intentName = res['query_result']['intent']['display_name']

EDIT 1:
Example -

import dialogflow
import os, json

def getCourse():
    doc_ref = db.collection(u"Course_Information").document(u"CourseTypes")
    try:
        doc = doc_ref.get()
        return 'Document data: {}'.format(doc.to_dict())
    except google.cloud.exceptions.NotFound:
        return 'Not found'

def detect_intent_text(project_id, session_id, text, language_code):
    GOOGLE_APPLICATION_CREDENTIALS="C:\\pyth_to_...\\cred.json"
    session_client = dialogflow.SessionsClient(GOOGLE_APPLICATION_CREDENTIALS)

    session = session_client.session_path(project_id, session_id)

    text_input = dialogflow.types.TextInput(
        text=text, language_code=language_code)

    query_input = dialogflow.types.QueryInput(text=text_input)

    response = session_client.detect_intent(
        session=session, query_input=query_input)

queryText = 'get courses of Python' # you will call some function to get text from your app

res = detect_intent_text('project_1234', 'session-test', queryText, 'en')
intentName = res['query_result']['intent']['display_name']

if intentName == 'getCourse':
    reponse = getCourse()
    return json.dumps({
        'fulfillmentText': reponse,
    })

Try above example and change according to your needs of app. My suggestion is to first get DialogFlow working without app, then integrate it with the app. Otherwise you won't be able to understand whether problem is happening in DialogFlow or your app.

Hope it helps.



来源:https://stackoverflow.com/questions/51621553/take-dialogflow-intent-and-query-firestore

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!