1
- from bson import ObjectId
1
+ # -*- coding: utf-8 -*-
2
+
2
3
import json
3
4
5
+ from flask import Blueprint , request , abort
4
6
from jinja2 import Template
5
7
6
- from flask import Blueprint , request , abort
7
8
from app import app
8
-
9
- from app .commons .logger import logger
9
+ from app .agents .models import Bot
10
10
from app .commons import build_response
11
- from app .nlu .entity_extractor import EntityExtractor
11
+ from app .commons .logger import logger
12
+ from app .endpoint .utils import SilentUndefined
13
+ from app .endpoint .utils import call_api
14
+ from app .endpoint .utils import get_synonyms
15
+ from app .endpoint .utils import split_sentence
12
16
from app .intents .models import Intent
13
-
14
- from app .endpoint .utils import get_synonyms , SilentUndefined , split_sentence , call_api
17
+ from app .nlu .classifiers .starspace_intent_classifier import \
18
+ EmbeddingIntentClassifier
19
+ from app .nlu .entity_extractor import EntityExtractor
20
+ from app .nlu .tasks import model_updated_signal
15
21
16
22
endpoint = Blueprint ('api' , __name__ , url_prefix = '/api' )
17
23
18
- # Loading ML Models at app startup
19
- from app .nlu .classifiers .starspace_intent_classifier import EmbeddingIntentClassifier
20
-
21
24
sentence_classifier = None
22
25
synonyms = None
23
26
entity_extraction = None
24
27
28
+
25
29
# Request Handler
26
30
@endpoint .route ('/v1' , methods = ['POST' ])
27
31
def api ():
@@ -72,8 +76,8 @@ def api():
72
76
logger .info (request_json .get ("input" ), extra = result_json )
73
77
return build_response .build_json (result_json )
74
78
75
- intent_id , confidence ,suggetions = predict (request_json .get ("input" ))
76
- app .logger .info ("intent_id => %s" % intent_id )
79
+ intent_id , confidence , suggetions = predict (request_json .get ("input" ))
80
+ app .logger .info ("intent_id => %s" % intent_id )
77
81
intent = Intent .objects .get (intentId = intent_id )
78
82
79
83
if intent .parameters :
@@ -86,7 +90,7 @@ def api():
86
90
result_json ["intent" ] = {
87
91
"object_id" : str (intent .id ),
88
92
"confidence" : confidence ,
89
- "id" : str (intent .intentId )
93
+ "id" : str (intent .intentId . encode ( 'utf8' ) )
90
94
}
91
95
92
96
if parameters :
@@ -163,7 +167,7 @@ def api():
163
167
isJson = False
164
168
parameters = result_json ["extractedParameters" ]
165
169
headers = intent .apiDetails .get_headers ()
166
- app .logger .info ("headers %s" % headers )
170
+ app .logger .info ("headers %s" % headers )
167
171
url_template = Template (
168
172
intent .apiDetails .url , undefined = SilentUndefined )
169
173
rendered_url = url_template .render (** context )
@@ -175,7 +179,7 @@ def api():
175
179
176
180
try :
177
181
result = call_api (rendered_url ,
178
- intent .apiDetails .requestType ,headers ,
182
+ intent .apiDetails .requestType , headers ,
179
183
parameters , isJson )
180
184
except Exception as e :
181
185
app .logger .warn ("API call failed" , e )
@@ -195,6 +199,7 @@ def api():
195
199
else :
196
200
return abort (400 )
197
201
202
+
198
203
def update_model (app , message , ** extra ):
199
204
"""
200
205
Signal hook to be called after training is completed.
@@ -212,23 +217,25 @@ def update_model(app, message, **extra):
212
217
entity_extraction = EntityExtractor (synonyms )
213
218
app .logger .info ("Intent Model updated" )
214
219
220
+
215
221
with app .app_context ():
216
- update_model (app ,"Modles updated" )
222
+ update_model (app , "Modles updated" )
217
223
218
- from app .nlu .tasks import model_updated_signal
219
224
model_updated_signal .connect (update_model , app )
220
225
221
- from app . agents . models import Bot
226
+
222
227
def predict (sentence ):
223
228
"""
224
229
Predict Intent using Intent classifier
225
230
:param sentence:
226
231
:return:
227
232
"""
228
233
bot = Bot .objects .get (name = "default" )
229
- predicted ,intents = sentence_classifier .process (sentence )
234
+ predicted , intents = sentence_classifier .process (sentence )
230
235
app .logger .info ("predicted intent %s" , predicted )
231
236
if predicted ["confidence" ] < bot .config .get ("confidence_threshold" , .90 ):
232
- return Intent .objects (intentId = app .config ["DEFAULT_FALLBACK_INTENT_NAME" ]).first ().intentId , 1.0 ,[]
237
+ intents = Intent .objects (intentId = app .config ["DEFAULT_FALLBACK_INTENT_NAME" ])
238
+ intents = intents .first ().intentId
239
+ return intents , 1.0 , []
233
240
else :
234
- return predicted ["intent" ], predicted ["confidence" ],intents [1 :]
241
+ return predicted ["intent" ], predicted ["confidence" ], intents [1 :]
0 commit comments