我的chatbot是在Dialogflow中创建的,我现在正试图从Python访问它,以获取用户输入并在GUI中显示输出(想想基本的chatbot GUI)。
我已经将Python环境连接到Dialogflow和firestore,
这是检测意图的代码;
#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")
我需要说如果这个意图被触发,从数据库中获取一些东西并显示给用户。
更新
我目前的代码完整,一切都很正常,但它抛出了一个错误,我不明白,感谢Sid8491的帮助迄今为止。
简而言之,我的问题是,我以前的代码允许我键入一些内容,而chatbot响应,这一切都在控制台中,但它工作了。。。新的代码应该允许我说“当这个意图被触发时,做这个”
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")
但我有个错误:
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
最佳答案
是的,我想你走对了。
您需要从intentName
得到的响应中提取actionaName
或dialogFlow
并调用相应的函数,然后将响应发送回用户。
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':
....
如果您希望使用
intentName
而不是actionName
来执行此操作,则可以如下提取intentName
intentName = res['query_result']['intent']['display_name']
编辑1:
示例-
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,
})
尝试上面的例子,并根据您的应用程序的需要进行更改。我的建议是,首先让DialogFlow在没有应用程序的情况下工作,然后将其与应用程序集成。否则,您将无法了解问题是发生在DialogFlow还是您的应用程序中。
希望有帮助。
关于python - 采取Dialogflow意图并查询Firestore,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51621553/