Evaluate stories
Evaluates one or multiple stories against the currently loaded Rasa model.
curl --request POST \
--url 'http://localhost:5005/model/test/stories?token=' \
--header 'Content-Type: text/yml' \
--data '- story: happy path
steps:
- intent: greet
- action: utter_greet
- intent: mood_great
- action: utter_happy
- story: sad path 1
steps:
- intent: greet
- action: utter_greet
- intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- intent: affirm
- action: utter_happy
- story: sad path 2
steps:
- intent: greet
- action: utter_greet
- intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- intent: deny
- action: utter_goodbye
- story: say goodbye
steps:
- intent: goodbye
- action: utter_goodbye'import requests
url = "http://localhost:5005/model/test/stories?token="
payload = "- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye"
headers = {"Content-Type": "text/yml"}
response = requests.post(url, data=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'text/yml'},
body: '- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye'
};
fetch('http://localhost:5005/model/test/stories?token=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "5005",
CURLOPT_URL => "http://localhost:5005/model/test/stories?token=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye",
CURLOPT_HTTPHEADER => [
"Content-Type: text/yml"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:5005/model/test/stories?token="
payload := strings.NewReader("- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "text/yml")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:5005/model/test/stories?token=")
.header("Content-Type", "text/yml")
.body("- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:5005/model/test/stories?token=")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'text/yml'
request.body = "- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye"
response = http.request(request)
puts response.read_body{
"actions": [
{
"action": "utter_ask_howcanhelp",
"predicted": "utter_ask_howcanhelp",
"policy": "policy_0_MemoizationPolicy",
"confidence": 1
}
],
"is_end_to_end_evaluation": true,
"precision": 1,
"f1": 0.9333333333333333,
"accuracy": 0.9,
"in_training_data_fraction": 0.8571428571428571,
"report": {
"conversation_accuracy": {
"accuracy": 0.19047619047619047,
"correct": 18,
"with_warnings": 1,
"total": 20
}
}
}{
"version": "1.0.0",
"status": "failure",
"reason": "BadRequest",
"code": 400
}{
"version": "1.0.0",
"status": "failure",
"reason": "NotAuthenticated",
"message": "User is not authenticated to access resource.",
"code": 401
}{
"version": "1.0.0",
"status": "failure",
"reason": "NotAuthorized",
"message": "User has insufficient permission to access resource.",
"code": 403
}{
"version": "1.0.0",
"status": "failure",
"reason": "Conflict",
"message": "The request conflicts with the currently loaded model.",
"code": 409
}{
"version": "1.0.0",
"status": "ServerError",
"message": "An unexpected error occurred.",
"code": 500
}Authorizations
A plaintext token to secure your server, specified at startup in the argument --auth-token thisismysecret
Query Parameters
Perform an end-to-end evaluation on the posted stories.
Body
Rasa Core stories in YAML format
"- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye"
Response
Success
Accuracy of the classification, http://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html
Show child attributes
Show child attributes
True if evaluation is end-to-end, false otherwise
true
Precision of the classification, see http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html
1
F1 score of the classification, http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html
0.9333333333333333
Accuracy of the classification, http://scikit-learn.org/stable/modules/generated/sklearn.metrics.accuracy_score.html
0.9
Fraction of stories that are present in the training data of the model loaded at evaluation time.
0.8571428571428571
Sklearn classification reported extended with information about conversation accuracy.
Show child attributes
Show child attributes
curl --request POST \
--url 'http://localhost:5005/model/test/stories?token=' \
--header 'Content-Type: text/yml' \
--data '- story: happy path
steps:
- intent: greet
- action: utter_greet
- intent: mood_great
- action: utter_happy
- story: sad path 1
steps:
- intent: greet
- action: utter_greet
- intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- intent: affirm
- action: utter_happy
- story: sad path 2
steps:
- intent: greet
- action: utter_greet
- intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- intent: deny
- action: utter_goodbye
- story: say goodbye
steps:
- intent: goodbye
- action: utter_goodbye'import requests
url = "http://localhost:5005/model/test/stories?token="
payload = "- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye"
headers = {"Content-Type": "text/yml"}
response = requests.post(url, data=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'text/yml'},
body: '- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye'
};
fetch('http://localhost:5005/model/test/stories?token=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "5005",
CURLOPT_URL => "http://localhost:5005/model/test/stories?token=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye",
CURLOPT_HTTPHEADER => [
"Content-Type: text/yml"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:5005/model/test/stories?token="
payload := strings.NewReader("- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "text/yml")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:5005/model/test/stories?token=")
.header("Content-Type", "text/yml")
.body("- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:5005/model/test/stories?token=")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'text/yml'
request.body = "- story: happy path\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_great\n - action: utter_happy\n\n- story: sad path 1\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: affirm\n - action: utter_happy\n\n- story: sad path 2\n steps:\n - intent: greet\n - action: utter_greet\n - intent: mood_unhappy\n - action: utter_cheer_up\n - action: utter_did_that_help\n - intent: deny\n - action: utter_goodbye\n\n- story: say goodbye\n steps:\n - intent: goodbye\n - action: utter_goodbye"
response = http.request(request)
puts response.read_body{
"actions": [
{
"action": "utter_ask_howcanhelp",
"predicted": "utter_ask_howcanhelp",
"policy": "policy_0_MemoizationPolicy",
"confidence": 1
}
],
"is_end_to_end_evaluation": true,
"precision": 1,
"f1": 0.9333333333333333,
"accuracy": 0.9,
"in_training_data_fraction": 0.8571428571428571,
"report": {
"conversation_accuracy": {
"accuracy": 0.19047619047619047,
"correct": 18,
"with_warnings": 1,
"total": 20
}
}
}{
"version": "1.0.0",
"status": "failure",
"reason": "BadRequest",
"code": 400
}{
"version": "1.0.0",
"status": "failure",
"reason": "NotAuthenticated",
"message": "User is not authenticated to access resource.",
"code": 401
}{
"version": "1.0.0",
"status": "failure",
"reason": "NotAuthorized",
"message": "User has insufficient permission to access resource.",
"code": 403
}{
"version": "1.0.0",
"status": "failure",
"reason": "Conflict",
"message": "The request conflicts with the currently loaded model.",
"code": 409
}{
"version": "1.0.0",
"status": "ServerError",
"message": "An unexpected error occurred.",
"code": 500
}