Python Client API Reference¶
Full API reference for the tryll_client Python package, auto-generated from
Google-style docstrings. The package lives at server/client-python/tryll_client/.
The public surface — re-exported from tryll_client.__init__ — is:
TryllClient, ConnectedSession, AgentProxy, TryllError,
GraphDescription, InferenceEngine, NodeType, ManagedServer, and the
knowledge-presentation config types.
ConnectedSession is the recommended entry point for local-server deployments;
obtain it via TryllClient.run_and_connect.
Internal modules (wire, codec, _generated) are excluded.
tryll_client¶
tryll_client ¶
tryll_client — Python client library for the Tryll server.
Quick start::
from tryll_client import TryllClient, InferenceEngine, NodeType, GraphDescription
client = TryllClient.connect("127.0.0.1", 9100)
client.configure_session(InferenceEngine.LlamaCpp)
graph = (GraphDescription()
.add_node("generate", NodeType.Generate, {
"system_prompt": "You are a helpful assistant.",
"stream": "true",
"temperature": "0",
"seed": "42",
})
.wire("generate", "default", "END")
.set_start_node("generate")
.set_default_model_name("Llama 3.2 3B Instruct (Q4_K_M)"))
agent = client.create_agent(graph)
response = agent.send_message("Hello!")
agent.destroy()
client.shutdown()
Prerequisites
The CMake build for server/ must have run at least once to generate FlatBuffers Python code into tryll_client/_generated/. Run: cmake --build server/build
AgentProxy ¶
Handle for one server-side agent created via TryllClient.create_agent().
The proxy exposes the user-facing turn API — :meth:send_message and
:meth:destroy — and caches diagnostics from the last completed turn
on last_* properties.
Bind the proxy to its owning client and server-side agent id.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
client
|
'TryllClient'
|
Parent :class: |
required |
agent_id
|
int
|
Server-assigned agent identifier returned in the
|
required |
last_debug_info
property
¶
JSON diagnostics string from the most recent send_message call.
Returns:
| Type | Description |
|---|---|
str
|
Server-produced JSON document attached to |
str
|
when diagnostics were enabled on agent creation; otherwise an |
str
|
empty string. Empty string also before the first turn. |
last_ttft_s
property
¶
Time-to-first-token in seconds for the most recent turn.
Returns:
| Type | Description |
|---|---|
float | None
|
Seconds elapsed from |
float | None
|
streamed |
float | None
|
arrived (e.g. canned-response paths that skip streaming). |
last_answer_chunk_count
property
¶
Number of AnswerText chunks received for the last turn.
Typically one chunk per generated token when streaming; useful for verifying the stream was delivered incrementally.
last_tokens_generated
property
¶
Server-reported generated token count for the last turn.
Authoritative for both streaming and non-streaming modes. Zero if the server has not yet completed a turn.
set_on_tool_call ¶
Register (or clear) a callback for tool-call notifications.
The callback is invoked on the reader thread for every
ToolCallNotification frame the server sends for this agent —
i.e. when the graph has a ToolCall node with
notify_client = "true". It must return quickly and must not
call any blocking :class:TryllClient or :class:AgentProxy
methods.
The callback signature is (tool_name: str, arguments_json: str)
where arguments_json is a compact JSON object, e.g.
'{"city": "Berlin"}'. Parse it with :func:json.loads as
needed.
Call with None to unregister the current callback.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cb
|
Callable[[str, str], None] | None
|
Callable invoked with |
required |
send_message ¶
Send a user message and return the complete assistant response.
Blocks until TurnComplete is received from the server,
accumulating all AnswerText chunks into a single string.
Diagnostics from TurnComplete (debug_info,
tokens_generated) are cached on the last_* properties.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
User-turn text to send to the agent. |
required |
timeout
|
float
|
Maximum seconds to wait for |
120.0
|
Returns:
| Type | Description |
|---|---|
str
|
The full concatenated assistant response text. |
Raises:
| Type | Description |
|---|---|
TryllError
|
On server-reported errors, decode failures, or
if |
change_param ¶
Mutate a named parameter on a workflow node at runtime.
The agent must not be processing a turn when this is called.
The change takes effect immediately for all subsequent turns.
For system_prompt, the KV cache is lazily invalidated on the
next :meth:send_message call.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
node_name
|
str
|
Instance name of the target node (as declared in the graph). |
required |
param_name
|
str
|
Parameter key to set (e.g. |
required |
param_value
|
str
|
New value as a string. |
required |
timeout
|
float
|
Maximum seconds to wait for the server |
30.0
|
Raises:
| Type | Description |
|---|---|
TryllError
|
On server-reported errors ( |
destroy ¶
Request agent destruction on the server and wait for Ack.
After this call returns, the proxy is no longer usable; further
send_message calls will raise :class:TryllError.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
timeout
|
float
|
Maximum seconds to wait for the |
30.0
|
Raises:
| Type | Description |
|---|---|
TryllError
|
On server-reported errors or timeout. |
ConnectedSession ¶
RAII wrapper that owns a :class:~tryll_client.managed_server.ManagedServer
and a connected :class:TryllClient.
Obtain via :meth:TryllClient.run_and_connect. Use as a context manager
(recommended) to guarantee teardown in the right order — client first, then
server::
with TryllClient.run_and_connect(exe=Path("..."), port=9100) as session:
session.client.configure_session(InferenceEngine.LlamaCpp)
agent = session.client.create_agent(graph)
print(agent.send_message("hi"))
TryllClient ¶
Synchronous TCP session to the Tryll server.
Usage::
client = TryllClient.connect("127.0.0.1", 9100)
client.configure_session(InferenceEngine.LlamaCpp)
graph = GraphDescription().add_node(...).wire(...).set_start_node(...)
agent = client.create_agent(graph)
response = agent.send_message("Hello")
agent.destroy()
client.shutdown()
connect
classmethod
¶
Connect to the Tryll server and wait for SessionReady.
run_and_connect
classmethod
¶
run_and_connect(*, exe, host='127.0.0.1', port=9100, cwd=None, extra_args=(), stdout=None, stderr=None, start_timeout=30.0, stop_timeout=8.0, connect_timeout=30.0)
Spawn tryll_server and connect — recommended one-call factory.
Starts a local server process (passing --port <port> on the command
line), waits for its TCP port to be ready, then opens a session.
The returned :class:ConnectedSession owns both the server process and
the client; use it as a context manager to guarantee clean teardown::
with TryllClient.run_and_connect(exe=Path("..."), port=9100) as session:
session.client.configure_session(InferenceEngine.LlamaCpp)
agent = session.client.create_agent(graph)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
exe
|
Path | str
|
Path to |
required |
host
|
str
|
Host for TCP probe and :meth: |
'127.0.0.1'
|
port
|
int
|
Port passed as |
9100
|
cwd
|
Path | None
|
Working directory for the child process (defaults to
|
None
|
extra_args
|
Sequence[str]
|
Additional CLI arguments after |
()
|
stdout
|
Path | None
|
File path for child stdout ( |
None
|
stderr
|
Path | None
|
File path for child stderr ( |
None
|
start_timeout
|
float
|
Seconds to wait for the TCP port to open (default 30). |
30.0
|
stop_timeout
|
float
|
Seconds to wait for graceful server exit (default 8). |
8.0
|
connect_timeout
|
float
|
Seconds to wait for :class: |
30.0
|
Returns:
| Name | Type | Description |
|---|---|---|
A |
'ConnectedSession'
|
class: |
'ConnectedSession'
|
connected. |
Raises:
| Type | Description |
|---|---|
FileNotFoundError
|
If exe does not exist. |
TimeoutError
|
If the port does not open within start_timeout. |
TryllError
|
If the session handshake fails. |
configure_session ¶
Send ConfigureSessionRequest and wait for response.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
engine
|
InferenceEngine | int
|
Inference backend to use for this session. |
required |
allow_auto_model_downloading
|
bool
|
When True, :meth: |
False
|
timeout
|
float
|
Maximum seconds to wait for the server response. |
30.0
|
create_string_storage ¶
Create a named StringStorage on the server.
Provide either strings (inline list) or file_path (server-side file path).
The storage can then be referenced by name in node params via string_storage.
destroy_string_storage ¶
Destroy a named StringStorage on the server.
Nodes that already hold the storage are unaffected.
create_embedded_string_storage ¶
create_embedded_string_storage(name, config_path=None, strings=None, embedding_model=None, timeout=None)
Create a named EmbeddedStringStorage on the server.
Path A: supply config_path (server-side *.json).
Path B: supply strings (inline list) + embedding_model.
Returns an EmbeddedStorageInfo with record_count and embedding_dim.
When allow_auto_model_downloading=True was passed to
:meth:configure_session the server may download the embedding model
before building the storage. The default timeout is bumped to 30
minutes in that case; otherwise it is 120 seconds.
destroy_embedded_string_storage ¶
Destroy a named EmbeddedStringStorage on the server.
Nodes that already hold the storage are unaffected.
create_agent ¶
Create a server-side agent and return a proxy handle.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
graph
|
GraphDescription
|
Fully-built graph description. |
required |
enable_diagnostics
|
bool
|
When True the server serialises per-node execution data into TurnComplete.debug_info for every turn. |
False
|
timeout
|
float | None
|
Maximum seconds to wait for the response. Defaults to 30 s
normally, or 30 minutes when :meth: |
None
|
list_models ¶
Request all models known to the server for the session's engine.
load_model ¶
Explicitly load and pin a model into memory.
The model stays in memory until :meth:unload_model is called,
regardless of whether any agents are using it.
Raises :class:TryllError if the model cannot be resolved or loaded.
unload_model ¶
Unpin a previously pinned model.
If no agents are currently using the model it is freed immediately; otherwise it will be freed when the last agent using it is destroyed.
download_model ¶
Initiate a model download on the server and block until complete.
on_progress is called with (model_name, bytes_downloaded, total_bytes, percent) for each progress frame received. Raises TryllError on failure.
TryllError ¶
Bases: Exception
Raised on server errors, protocol errors, or timeouts.
Attributes:
| Name | Type | Description |
|---|---|---|
code |
Numeric error code from the server's |
Initialise a Tryll client error.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
message
|
str
|
Human-readable description of the failure, typically
copied from the server's |
required |
code
|
int
|
Numeric error code from |
0
|
GraphDescription ¶
Fluent builder for a workflow graph sent to the server.
Typical usage::
graph = (GraphDescription()
.add_node("gen", NodeType.Generate, {"prompt": "..."})
.set_start_node("gen")
.set_default_model_name("qwen2.5-0.5b-instruct"))
agent = client.create_agent(graph)
Create an empty graph description with no nodes, wires, or start node.
add_node ¶
Append a node to the graph.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Graph-unique node name; used by :meth: |
required |
node_type
|
NodeType | int
|
Node kind; see :class: |
required |
params
|
dict[str, str] | None
|
Key/value node parameters. All values are sent as strings on the wire. |
None
|
Returns:
| Type | Description |
|---|---|
'GraphDescription'
|
|
add_tool_call_node ¶
Append a ToolCall node with structured tool definitions.
Convenience over :meth:add_node that accepts a list of
:class:ToolDef rather than encoding tools into string params.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Graph-unique node name. |
required |
tools
|
list[ToolDef]
|
Tool definitions available to the model at this node. |
required |
params
|
dict[str, str] | None
|
Additional key/value node parameters. |
None
|
Returns:
| Type | Description |
|---|---|
'GraphDescription'
|
|
wire ¶
Add a wire (exit route) from one node to another.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
source
|
str
|
Name of the node the wire leaves. |
required |
exit_name
|
str
|
Name of the exit route on |
required |
target
|
str
|
Name of the node the wire enters. |
required |
Returns:
| Type | Description |
|---|---|
'GraphDescription'
|
|
set_start_node ¶
Nominate which node receives the turn when the agent runs.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Name of a node previously added via :meth: |
required |
Returns:
| Type | Description |
|---|---|
'GraphDescription'
|
|
set_default_model_name ¶
Set the default catalog model name for nodes that need one.
Nodes that invoke a language model (Generate, ToolCall)
use this value when their own model param is unset.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Catalog model name as registered in |
required |
Returns:
| Type | Description |
|---|---|
'GraphDescription'
|
|
InferenceEngine ¶
Bases: IntEnum
Inference backend that runs the model.
Passed to :meth:TryllClient.configure_session to select the engine
for all agents on this session. Mirrors the FlatBuffers
InferenceEngine enum.
Mock
class-attribute
instance-attribute
¶
In-process mock engine used by tests. No real inference.
LlamaCpp
class-attribute
instance-attribute
¶
llama.cpp — GGUF models. The default production engine.
OnnxGenAI
class-attribute
instance-attribute
¶
ONNX GenAI — not yet implemented (reserved).
WindowsML
class-attribute
instance-attribute
¶
Windows ML — not yet implemented (reserved).
OpenVino
class-attribute
instance-attribute
¶
Intel OpenVINO — not yet implemented (reserved).
TensorRtLlm
class-attribute
instance-attribute
¶
NVIDIA TensorRT-LLM — not yet implemented (reserved).
ModelInfo
dataclass
¶
Summary information for one model returned by list_models().
hf_repo
instance-attribute
¶
HuggingFace repository identifier, or empty string for local-only models.
ModelStatus ¶
Bases: IntEnum
Status of a model as reported by the server.
Mirrors ModelStatus in messages.fbs.
Absent
class-attribute
instance-attribute
¶
No record of this model; call download_model first.
Local
class-attribute
instance-attribute
¶
User-supplied localPath model on disk; ready to load.
Downloading
class-attribute
instance-attribute
¶
Download in progress from HuggingFace.
Loaded
class-attribute
instance-attribute
¶
Model files are present and pinned into memory.
Downloaded
class-attribute
instance-attribute
¶
Model files are present in the HuggingFace cache; not loaded.
NodeType ¶
Bases: IntEnum
Workflow node kind. Mirrors NodeType in messages.fbs.
HumanMessageGuardrail
class-attribute
instance-attribute
¶
Pattern match on the incoming user message; routes accordingly.
CannedResponse
class-attribute
instance-attribute
¶
Emit a pre-written reply without invoking a model.
ToolCall
class-attribute
instance-attribute
¶
Detect and emit a tool-call invocation (small-model-friendly).
Retrieve
class-attribute
instance-attribute
¶
RAG: retrieve chunks from an embedded string storage.
Instruction
class-attribute
instance-attribute
¶
Attach a named instruction string to the current interaction.
ManagedServer ¶
ManagedServer(*, exe, host='127.0.0.1', port=9100, cwd=None, extra_args=(), stdout=None, stderr=None, start_timeout=30.0, stop_timeout=8.0)
RAII handle around a child tryll_server process.
Use as a context manager (recommended), or call :meth:stop explicitly::
with ManagedServer.start(exe=Path("..."), port=9100) as srv:
client = TryllClient.connect(srv.host, srv.port)
...
No executable discovery is performed — pass the path explicitly.
The server is always launched with --port <port> so the caller's port
takes precedence over whatever is in server-config.json.
start
classmethod
¶
start(*, exe, host='127.0.0.1', port=9100, cwd=None, extra_args=(), stdout=None, stderr=None, start_timeout=30.0, stop_timeout=8.0)
Spawn the server and block until its TCP port is ready.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
exe
|
Path | str
|
Path to |
required |
host
|
str
|
Host string for the TCP ready-probe (default |
'127.0.0.1'
|
port
|
int
|
TCP port; passed as |
9100
|
cwd
|
Path | None
|
Working directory for the child process (defaults to
|
None
|
extra_args
|
Sequence[str]
|
Additional CLI arguments appended after |
()
|
stdout
|
Path | None
|
File path for child stdout redirection ( |
None
|
stderr
|
Path | None
|
File path for child stderr redirection ( |
None
|
start_timeout
|
float
|
Seconds to wait for the TCP port to open (default 30). |
30.0
|
stop_timeout
|
float
|
Seconds to wait for clean exit on :meth: |
8.0
|
Returns:
| Name | Type | Description |
|---|---|---|
A |
'ManagedServer'
|
class: |
Raises:
| Type | Description |
|---|---|
FileNotFoundError
|
If exe does not exist. |
TimeoutError
|
If the port does not open within start_timeout. |
OSError
|
If the process cannot be spawned. |
stop ¶
Terminate the child process.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
timeout
|
float | None
|
Seconds to wait before force-killing (defaults to the stop_timeout supplied at construction). |
None
|
tryll_client.client¶
tryll_client.client ¶
TryllClient — synchronous TCP client for the Tryll server.
Threading model
- A background reader thread continuously receives frames and dispatches them to registered pending requests via threading.Event.
- The main (calling) thread sends requests and blocks on the Event.
- All access to _pending is protected by _lock.
TryllClient ¶
Synchronous TCP session to the Tryll server.
Usage::
client = TryllClient.connect("127.0.0.1", 9100)
client.configure_session(InferenceEngine.LlamaCpp)
graph = GraphDescription().add_node(...).wire(...).set_start_node(...)
agent = client.create_agent(graph)
response = agent.send_message("Hello")
agent.destroy()
client.shutdown()
connect
classmethod
¶
Connect to the Tryll server and wait for SessionReady.
run_and_connect
classmethod
¶
run_and_connect(*, exe, host='127.0.0.1', port=9100, cwd=None, extra_args=(), stdout=None, stderr=None, start_timeout=30.0, stop_timeout=8.0, connect_timeout=30.0)
Spawn tryll_server and connect — recommended one-call factory.
Starts a local server process (passing --port <port> on the command
line), waits for its TCP port to be ready, then opens a session.
The returned :class:ConnectedSession owns both the server process and
the client; use it as a context manager to guarantee clean teardown::
with TryllClient.run_and_connect(exe=Path("..."), port=9100) as session:
session.client.configure_session(InferenceEngine.LlamaCpp)
agent = session.client.create_agent(graph)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
exe
|
Path | str
|
Path to |
required |
host
|
str
|
Host for TCP probe and :meth: |
'127.0.0.1'
|
port
|
int
|
Port passed as |
9100
|
cwd
|
Path | None
|
Working directory for the child process (defaults to
|
None
|
extra_args
|
Sequence[str]
|
Additional CLI arguments after |
()
|
stdout
|
Path | None
|
File path for child stdout ( |
None
|
stderr
|
Path | None
|
File path for child stderr ( |
None
|
start_timeout
|
float
|
Seconds to wait for the TCP port to open (default 30). |
30.0
|
stop_timeout
|
float
|
Seconds to wait for graceful server exit (default 8). |
8.0
|
connect_timeout
|
float
|
Seconds to wait for :class: |
30.0
|
Returns:
| Name | Type | Description |
|---|---|---|
A |
'ConnectedSession'
|
class: |
'ConnectedSession'
|
connected. |
Raises:
| Type | Description |
|---|---|
FileNotFoundError
|
If exe does not exist. |
TimeoutError
|
If the port does not open within start_timeout. |
TryllError
|
If the session handshake fails. |
configure_session ¶
Send ConfigureSessionRequest and wait for response.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
engine
|
InferenceEngine | int
|
Inference backend to use for this session. |
required |
allow_auto_model_downloading
|
bool
|
When True, :meth: |
False
|
timeout
|
float
|
Maximum seconds to wait for the server response. |
30.0
|
create_string_storage ¶
Create a named StringStorage on the server.
Provide either strings (inline list) or file_path (server-side file path).
The storage can then be referenced by name in node params via string_storage.
destroy_string_storage ¶
Destroy a named StringStorage on the server.
Nodes that already hold the storage are unaffected.
create_embedded_string_storage ¶
create_embedded_string_storage(name, config_path=None, strings=None, embedding_model=None, timeout=None)
Create a named EmbeddedStringStorage on the server.
Path A: supply config_path (server-side *.json).
Path B: supply strings (inline list) + embedding_model.
Returns an EmbeddedStorageInfo with record_count and embedding_dim.
When allow_auto_model_downloading=True was passed to
:meth:configure_session the server may download the embedding model
before building the storage. The default timeout is bumped to 30
minutes in that case; otherwise it is 120 seconds.
destroy_embedded_string_storage ¶
Destroy a named EmbeddedStringStorage on the server.
Nodes that already hold the storage are unaffected.
create_agent ¶
Create a server-side agent and return a proxy handle.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
graph
|
GraphDescription
|
Fully-built graph description. |
required |
enable_diagnostics
|
bool
|
When True the server serialises per-node execution data into TurnComplete.debug_info for every turn. |
False
|
timeout
|
float | None
|
Maximum seconds to wait for the response. Defaults to 30 s
normally, or 30 minutes when :meth: |
None
|
list_models ¶
Request all models known to the server for the session's engine.
load_model ¶
Explicitly load and pin a model into memory.
The model stays in memory until :meth:unload_model is called,
regardless of whether any agents are using it.
Raises :class:TryllError if the model cannot be resolved or loaded.
unload_model ¶
Unpin a previously pinned model.
If no agents are currently using the model it is freed immediately; otherwise it will be freed when the last agent using it is destroyed.
download_model ¶
Initiate a model download on the server and block until complete.
on_progress is called with (model_name, bytes_downloaded, total_bytes, percent) for each progress frame received. Raises TryllError on failure.
ConnectedSession ¶
RAII wrapper that owns a :class:~tryll_client.managed_server.ManagedServer
and a connected :class:TryllClient.
Obtain via :meth:TryllClient.run_and_connect. Use as a context manager
(recommended) to guarantee teardown in the right order — client first, then
server::
with TryllClient.run_and_connect(exe=Path("..."), port=9100) as session:
session.client.configure_session(InferenceEngine.LlamaCpp)
agent = session.client.create_agent(graph)
print(agent.send_message("hi"))
tryll_client.agent¶
tryll_client.agent ¶
AgentProxy — client-side handle for a server-side agent.
An :class:AgentProxy is returned by
:meth:tryll_client.TryllClient.create_agent and represents a single
server-side agent running a pre-built workflow graph. The proxy is
single-session and not thread-safe beyond what the parent
:class:TryllClient provides.
AgentProxy ¶
Handle for one server-side agent created via TryllClient.create_agent().
The proxy exposes the user-facing turn API — :meth:send_message and
:meth:destroy — and caches diagnostics from the last completed turn
on last_* properties.
Bind the proxy to its owning client and server-side agent id.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
client
|
'TryllClient'
|
Parent :class: |
required |
agent_id
|
int
|
Server-assigned agent identifier returned in the
|
required |
last_debug_info
property
¶
JSON diagnostics string from the most recent send_message call.
Returns:
| Type | Description |
|---|---|
str
|
Server-produced JSON document attached to |
str
|
when diagnostics were enabled on agent creation; otherwise an |
str
|
empty string. Empty string also before the first turn. |
last_ttft_s
property
¶
Time-to-first-token in seconds for the most recent turn.
Returns:
| Type | Description |
|---|---|
float | None
|
Seconds elapsed from |
float | None
|
streamed |
float | None
|
arrived (e.g. canned-response paths that skip streaming). |
last_answer_chunk_count
property
¶
Number of AnswerText chunks received for the last turn.
Typically one chunk per generated token when streaming; useful for verifying the stream was delivered incrementally.
last_tokens_generated
property
¶
Server-reported generated token count for the last turn.
Authoritative for both streaming and non-streaming modes. Zero if the server has not yet completed a turn.
set_on_tool_call ¶
Register (or clear) a callback for tool-call notifications.
The callback is invoked on the reader thread for every
ToolCallNotification frame the server sends for this agent —
i.e. when the graph has a ToolCall node with
notify_client = "true". It must return quickly and must not
call any blocking :class:TryllClient or :class:AgentProxy
methods.
The callback signature is (tool_name: str, arguments_json: str)
where arguments_json is a compact JSON object, e.g.
'{"city": "Berlin"}'. Parse it with :func:json.loads as
needed.
Call with None to unregister the current callback.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cb
|
Callable[[str, str], None] | None
|
Callable invoked with |
required |
send_message ¶
Send a user message and return the complete assistant response.
Blocks until TurnComplete is received from the server,
accumulating all AnswerText chunks into a single string.
Diagnostics from TurnComplete (debug_info,
tokens_generated) are cached on the last_* properties.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
User-turn text to send to the agent. |
required |
timeout
|
float
|
Maximum seconds to wait for |
120.0
|
Returns:
| Type | Description |
|---|---|
str
|
The full concatenated assistant response text. |
Raises:
| Type | Description |
|---|---|
TryllError
|
On server-reported errors, decode failures, or
if |
change_param ¶
Mutate a named parameter on a workflow node at runtime.
The agent must not be processing a turn when this is called.
The change takes effect immediately for all subsequent turns.
For system_prompt, the KV cache is lazily invalidated on the
next :meth:send_message call.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
node_name
|
str
|
Instance name of the target node (as declared in the graph). |
required |
param_name
|
str
|
Parameter key to set (e.g. |
required |
param_value
|
str
|
New value as a string. |
required |
timeout
|
float
|
Maximum seconds to wait for the server |
30.0
|
Raises:
| Type | Description |
|---|---|
TryllError
|
On server-reported errors ( |
destroy ¶
Request agent destruction on the server and wait for Ack.
After this call returns, the proxy is no longer usable; further
send_message calls will raise :class:TryllError.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
timeout
|
float
|
Maximum seconds to wait for the |
30.0
|
Raises:
| Type | Description |
|---|---|
TryllError
|
On server-reported errors or timeout. |
tryll_client.graph¶
tryll_client.graph ¶
GraphDescription builder and associated enums / dataclasses.
Mirrors the C++ Tryll::Client::GraphDescription / InferenceEngine
/ NodeType types. Enum values must stay in sync with
server/schema/messages.fbs.
This module exposes:
- :class:
GraphDescription— fluent builder for a workflow graph sent to the server onCreateAgent. - The enums used by graph descriptions: :class:
InferenceEngine, :class:NodeType, :class:ModelStatus. - The value types: :class:
ModelInfo, :class:ToolDef, :class:ToolParamDef.
InferenceEngine ¶
Bases: IntEnum
Inference backend that runs the model.
Passed to :meth:TryllClient.configure_session to select the engine
for all agents on this session. Mirrors the FlatBuffers
InferenceEngine enum.
Mock
class-attribute
instance-attribute
¶
In-process mock engine used by tests. No real inference.
LlamaCpp
class-attribute
instance-attribute
¶
llama.cpp — GGUF models. The default production engine.
OnnxGenAI
class-attribute
instance-attribute
¶
ONNX GenAI — not yet implemented (reserved).
WindowsML
class-attribute
instance-attribute
¶
Windows ML — not yet implemented (reserved).
OpenVino
class-attribute
instance-attribute
¶
Intel OpenVINO — not yet implemented (reserved).
TensorRtLlm
class-attribute
instance-attribute
¶
NVIDIA TensorRT-LLM — not yet implemented (reserved).
ModelStatus ¶
Bases: IntEnum
Status of a model as reported by the server.
Mirrors ModelStatus in messages.fbs.
Absent
class-attribute
instance-attribute
¶
No record of this model; call download_model first.
Local
class-attribute
instance-attribute
¶
User-supplied localPath model on disk; ready to load.
Downloading
class-attribute
instance-attribute
¶
Download in progress from HuggingFace.
Loaded
class-attribute
instance-attribute
¶
Model files are present and pinned into memory.
Downloaded
class-attribute
instance-attribute
¶
Model files are present in the HuggingFace cache; not loaded.
ModelInfo
dataclass
¶
Summary information for one model returned by list_models().
hf_repo
instance-attribute
¶
HuggingFace repository identifier, or empty string for local-only models.
NodeType ¶
Bases: IntEnum
Workflow node kind. Mirrors NodeType in messages.fbs.
HumanMessageGuardrail
class-attribute
instance-attribute
¶
Pattern match on the incoming user message; routes accordingly.
CannedResponse
class-attribute
instance-attribute
¶
Emit a pre-written reply without invoking a model.
ToolCall
class-attribute
instance-attribute
¶
Detect and emit a tool-call invocation (small-model-friendly).
Retrieve
class-attribute
instance-attribute
¶
RAG: retrieve chunks from an embedded string storage.
Instruction
class-attribute
instance-attribute
¶
Attach a named instruction string to the current interaction.
ToolParamDef
dataclass
¶
Description of one parameter in a tool definition.
ToolDef
dataclass
¶
NodeDesc
dataclass
¶
RouteDesc
dataclass
¶
Internal serialisable description of one wire (exit route) between two nodes.
GraphDescription ¶
Fluent builder for a workflow graph sent to the server.
Typical usage::
graph = (GraphDescription()
.add_node("gen", NodeType.Generate, {"prompt": "..."})
.set_start_node("gen")
.set_default_model_name("qwen2.5-0.5b-instruct"))
agent = client.create_agent(graph)
Create an empty graph description with no nodes, wires, or start node.
add_node ¶
Append a node to the graph.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Graph-unique node name; used by :meth: |
required |
node_type
|
NodeType | int
|
Node kind; see :class: |
required |
params
|
dict[str, str] | None
|
Key/value node parameters. All values are sent as strings on the wire. |
None
|
Returns:
| Type | Description |
|---|---|
'GraphDescription'
|
|
add_tool_call_node ¶
Append a ToolCall node with structured tool definitions.
Convenience over :meth:add_node that accepts a list of
:class:ToolDef rather than encoding tools into string params.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Graph-unique node name. |
required |
tools
|
list[ToolDef]
|
Tool definitions available to the model at this node. |
required |
params
|
dict[str, str] | None
|
Additional key/value node parameters. |
None
|
Returns:
| Type | Description |
|---|---|
'GraphDescription'
|
|
wire ¶
Add a wire (exit route) from one node to another.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
source
|
str
|
Name of the node the wire leaves. |
required |
exit_name
|
str
|
Name of the exit route on |
required |
target
|
str
|
Name of the node the wire enters. |
required |
Returns:
| Type | Description |
|---|---|
'GraphDescription'
|
|
set_start_node ¶
Nominate which node receives the turn when the agent runs.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Name of a node previously added via :meth: |
required |
Returns:
| Type | Description |
|---|---|
'GraphDescription'
|
|
set_default_model_name ¶
Set the default catalog model name for nodes that need one.
Nodes that invoke a language model (Generate, ToolCall)
use this value when their own model param is unset.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Catalog model name as registered in |
required |
Returns:
| Type | Description |
|---|---|
'GraphDescription'
|
|
tryll_client.errors¶
tryll_client.errors ¶
Exception type for Tryll client errors.
All failures surfaced by the synchronous client — server-reported errors,
protocol-level decode failures, and timeouts — are raised as
:class:TryllError. Server-reported errors carry a numeric code that
matches the ranges defined in server/common/include/tryll/ErrorCodes.h;
client-originated errors (timeouts, closed socket) carry code == 0.
TryllError ¶
Bases: Exception
Raised on server errors, protocol errors, or timeouts.
Attributes:
| Name | Type | Description |
|---|---|---|
code |
Numeric error code from the server's |
Initialise a Tryll client error.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
message
|
str
|
Human-readable description of the failure, typically
copied from the server's |
required |
code
|
int
|
Numeric error code from |
0
|
tryll_client.managed_server¶
tryll_client.managed_server ¶
managed_server — spawn a tryll_server child process and wait for TCP readiness.
Typical usage::
from pathlib import Path
from tryll_client import TryllClient, ManagedServer
with ManagedServer.start(exe=Path("C:/tryll/tryll_server.exe"), port=9100) as srv:
client = TryllClient.connect(srv.host, srv.port)
client.configure_session(...)
# … use client …
client.shutdown()
No executable discovery is performed here. Pass the path to the server
executable explicitly (or use the helpers in qa-and-eval/tryll_qa to
locate it).
ManagedServer ¶
ManagedServer(*, exe, host='127.0.0.1', port=9100, cwd=None, extra_args=(), stdout=None, stderr=None, start_timeout=30.0, stop_timeout=8.0)
RAII handle around a child tryll_server process.
Use as a context manager (recommended), or call :meth:stop explicitly::
with ManagedServer.start(exe=Path("..."), port=9100) as srv:
client = TryllClient.connect(srv.host, srv.port)
...
No executable discovery is performed — pass the path explicitly.
The server is always launched with --port <port> so the caller's port
takes precedence over whatever is in server-config.json.
start
classmethod
¶
start(*, exe, host='127.0.0.1', port=9100, cwd=None, extra_args=(), stdout=None, stderr=None, start_timeout=30.0, stop_timeout=8.0)
Spawn the server and block until its TCP port is ready.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
exe
|
Path | str
|
Path to |
required |
host
|
str
|
Host string for the TCP ready-probe (default |
'127.0.0.1'
|
port
|
int
|
TCP port; passed as |
9100
|
cwd
|
Path | None
|
Working directory for the child process (defaults to
|
None
|
extra_args
|
Sequence[str]
|
Additional CLI arguments appended after |
()
|
stdout
|
Path | None
|
File path for child stdout redirection ( |
None
|
stderr
|
Path | None
|
File path for child stderr redirection ( |
None
|
start_timeout
|
float
|
Seconds to wait for the TCP port to open (default 30). |
30.0
|
stop_timeout
|
float
|
Seconds to wait for clean exit on :meth: |
8.0
|
Returns:
| Name | Type | Description |
|---|---|---|
A |
'ManagedServer'
|
class: |
Raises:
| Type | Description |
|---|---|
FileNotFoundError
|
If exe does not exist. |
TimeoutError
|
If the port does not open within start_timeout. |
OSError
|
If the process cannot be spawned. |
stop ¶
Terminate the child process.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
timeout
|
float | None
|
Seconds to wait before force-killing (defaults to the stop_timeout supplied at construction). |
None
|
wait_for_tcp ¶
Block until host:port accepts a TCP connection or timeout_sec expires.
Raises :class:TimeoutError if the port does not open in time.
start_server_process ¶
Start exe as a child process, passing --port <port> on the command line.
cwd defaults to the executable's directory (where data/ usually lives).
log_dir is the directory where server_stdout.txt and
server_stderr.txt are written. Defaults to the executable's directory.
Pass Path(os.devnull) to suppress output entirely.
stop_server_process ¶
Terminate proc; kill if it does not exit within terminate_timeout.