A Ruby SDK to the https://api.ai natural language processing service.
gem install api-ai-ruby
Just pass correct credentials to ApiAiRuby::Client constructor
client = ApiAiRuby::Client.new(
:client_access_token => 'YOUR_CLIENT_ACCESS_TOKEN'
)
After that you can send text requests to the https://api.ai with command
response = client.text_request 'hello!'
Or try to invocate intent via defined 'event':
response_zero = client.event_request 'MY_CUSTOM_EVENT_NAME';
response_one = client.event_request 'MY_EVENT_WITH_DATA_TO_STORE', {:param1 => 'value'}
response_two = client.event_request 'MY_EVENT_WITH_DATA_TO_STORE', {:some_param => 'some_value'}, :resetContexts => true
voice_request and text_request methods returns symbolized https://api.ai response. Structure of response can be found at https://docs.api.ai/docs/query#response.
During client instantiating you can additionally set parameters like api url, request language and version (more info at https://docs.api.ai/docs/versioning, https://docs.api.ai/docs/languages)
ApiAiRuby::Client.new(
client_access_token: 'YOUR_ACCESS_TOKEN',
api_lang: 'FR',
api_base_url: 'http://example.com/v1/',
api_version: 'YYYYMMDD',
api_session_id: 'some_uuid_or_whatever'
)
And you also can send additional data to server during request, use second parameter of text_request and voice_request methods to do that
response = client.text_request 'Hello', :contexts => ['firstContext'], :resetContexts => true
response = client.voice_request file, :timezone => 'America/New_York'
More information about possible parameters can be found at https://docs.api.ai/docs/query page
Another possibility is to send and retrieve custom entities to the server.
You can do it along with query request
client.text_request 'call Mozart', entities: [
{
name: 'contacts',
entries: [
ApiAiRuby::Entry.new('Mozart', %w(Mozart Wolfgang)),
ApiAiRuby::Entry.new('Salieri', %w(Salieri Antonio))
]
}
]
# the same without ApiAiRuby::Entry wrapper
client.text_request 'call Mozart', entities: [
{
name: 'contacts',
entries: [
{value: 'Mozart', synonyms: %w(Mozart Wolfgang)},
{value: 'Salieri', synonyms: %w(Salieri Antonio)}
]
}
]
Or with separate create_user_entities_request object with full CRUD support:
# preparations
entries_composers = [
ApiAiRuby::Entry.new('Mozart', %w(Mozart Wolfgang)),
ApiAiRuby::Entry.new('Salieri', %w(Salieri Antonio))
]
entries_unknown = [
ApiAiRuby::Entry.new('John Doe', %w(John Unknown)),
ApiAiRuby::Entry.new('Jane Doe', %w(Jane))
]
entity_contacts = ApiAiRuby::Entity.new('contacts', entries_composers)
# let's go
uer = client.create_user_entities_request
uer.create(entity_contacts) # or uer.create([entity1, entity2...])
client.text_request 'call Mozart' # will work
uer.update('contacts', entries_unknown)
client.text_request 'call Mozart' # will NOT work
client.text_request 'call John' # will work
uer.retrieve('contacts') # will return current state of user entity
uer.delete('contacts') # will remove user entities for given session
Also SDK has full support of contexts API.AI endpoint with special object, called contexts_request
Usage is simple:
# some preparations
lifespan = 5
parameters = {
:param_name => 'param_value'
}
name = 'test_context'
# you can create context using built-in model ApiAiRuby::Context
test_context = ApiAiRuby::Context.new(name, lifespan, parameters)
another_test_context = ApiAiRuby::Context.new('another_test_context')
one_more_test_context = ApiAiRuby::Context.new('one_more_test_context', 4)
# ok, we are ready
context_request = @client.create_contexts_request
# there are different options to be used with .create
context_request.create(test_context)
context_request.create([another_test_context, one_more_test_context])
context_request.create('one_more_super_final_mega_context')
context_request.retrieve('test_context') # will return you single context or nothing
context_request.list() # will return you list of all contexts used in current session
context_request.delete('test_context') # will remove single context
context_request.delete() # will remove all context in session
ApiAiRuby::Client uses the http gem under the hood. You can use timeout_options
on the client to set these.
ApiAiRuby::Client.new(
client_access_token: 'YOUR_ACCESS_TOKEN',
api_lang: 'FR',
api_base_url: 'http://example.com/v1/',
api_version: 'YYYYMMDD',
api_session_id: 'some_uuid_or_whatever',
timeout_options: [:global, { write: 1, connect: 1, read: 1 }]
)
Please see the httprb wiki on timeouts for more information.
ApiAiRuby::Client currently able to raise two kind of errors: ApiAiRuby::ClientError (due to configuration mismatch) and ApiAiRuby::RequestError in case of something goes wrong during request. For both kind of errors you can get error.message (as usual) and ApiAiRuby::RequestError can additionally give you code of server error (you can get it with error.code)
- http gem dependency updated to 2.0, it does no longer raise
Errno::ETIMEDOUT
. Thanks to @tak1n
- contexts endpoint support (https://docs.api.ai/docs/contexts)
- better RDoc
- ApiAiRuby::Client::user_entities_request renamed to ApiAiRuby::Client::create_user_entities_request
- ApiAiRuby::Entity::addEntry renamed to ApiAiRuby::Entity::add_entry
- 1.2.3 - events support
- 1.2.2 - added configurable timeouts for requests (thanks bramski)
- 1.2.1 - fixed UTF-8 in text-requests
- 1.2.0 - added configurable session_id and full userEntities support
- 1.1.4 - removed unused dependency and updated default API version
- 1.1.3 - fixed non-correctly serialized parameters in new contexts during query send process
- 1.1.2 - fixed compatibility with ruby version less then 2.1.6