
Client/Server Protocol
======================

.. highlight:: python

This document describes the Personis *access*, *ask* and *tell* calls in terms of the Python method calls.

**access**::

	personis.client.Access(uri = personis_uri, credentials = cred, http=http)

The POST URL is then /access and the body is (for example)::

	{"password": "", "modelname": "bob", "user": "bob", "version": "11.2"}

The password and user are now vestigal. These are taken care of at the http level. A user may still have multiple models in a server, so modelname can be used. The default is the main user model.

the return data is::

	{"result": "ok", "val": true}     -- on success
	{"result": "fail", "val": false}     -- on failure
	I might change this to include a diagnostic string as the value of val.


**tell**::

	def tell(modelname=string, version="11.2", 
                context=list-of-strings, componentid=string, evidence=dict)

The URL is /tell

Body example::

	{"modelname": "bob", 
	"user": "bob", 
	"password": "", 
	"version": "11.2", 
	"evidence": {"comment": null, "evidence_type": "explicit", "value": "Bob", 
	                "objectType": "Evidence", "source": "demoex2", "flags": [], 
	                "time": null, "exp_time": 0}, 
	"context": ["Personal"], 
	"componentid": "firstname"}

Note that the evidence dictionary should be extensible, ie not just the fields shown. Keys are strings, values can be strings/None/integer/list-of-strings

The return data is::

	{"result": "ok", "val": true}     -- on success
	{"result": "fail", "val": false}     -- on failure
	I might change this to include a diagnostic string as the value of val.[a]


**ask**::

	def ask(modelname=string, version="11.2", 
                context=list-of-strings, 
                resolve=dict,
                showcontexts=true-or-false,[b]
                view=list-of-(string-or-list-of-string) )

The resolver dictionary is extensible, keys and values are strings, *view* is a list of strings or (list of strings)

The URL is /ask

Body example::

	{"modelname": "bob", 
	"user": "bob", 
	"password": "", 
	"version": "11.2", 
	"context": ["Preferences", "Music", "Jazz", "Artists"], 
	"showcontexts": null,
	"resolver": {"evidence_filter": "all"}, 
	"view": ["Miles_Davis", ["Personal", "firstname"]]}

The return data is a dictionary containing a result and val entries like the Access function.
The value for "val" is a list of dictionaries, one per component value being returned.

example::

	{"result": "ok", "val": 
	 [        {"Description": "First name", 
	        "component_type": "attribute", 
	        "evidencelist": null, 
	        "value_list": null, 
	        "value": "Bob", 
	        "value_type": "string", 
	        "goals": [], 
	        "resolver": null, 
	        "Identifier": "firstname", 
	        "objectType": "Component"}, 
	        {"Description": "Last name", 
	        "component_type": "attribute", 
	        "evidencelist": null, 
	        "value_list": null, 
	        "value": "Kummerfeld", 
	        "value_type": "string", 
	        "goals": [], 
	        "resolver": null, 
	        "Identifier": "lastname", 
	        "objectType": "Component"}
	 ]
	}


The POST requests should be over HTTPS. Also, a future stage of development will involve more crypto with signed, encrypted JSON.

