engini
Agent-first Python SDK for the Engini Public API — discover tools, execute them against your connected apps, and wrap them as LLM tool definitions.
pip install engini
Quickstart
from engini import Engini
client = Engini(api_key="eng_…") # or set ENGINI_API_KEY
# Discover canonical tool schemas
tools = client.tools.get(applications=["salesforce"], search="accounts", limit=5)
# Execute a tool against a connection
conn_id = next(c.connection_id for c in client.connections.list(application="salesforce"))
result = client.tools.execute(
"salesforce_getrecords", {"sobject": "Account"}, connection_id=conn_id
)
print(result.output)
JWT auth is the fallback: Engini(token="<jwt>", company_token="<id>"), or set
ENGINI_API_TOKEN / ENGINI_COMPANY_TOKEN. With an API key the company is bound to the key,
so no company token is needed. Point at another host with Engini(..., base_url=…).
Use with an LLM
Provider adapters wrap canonical schemas into vendor tool definitions client-side, with no
vendor SDK dependency. OpenAI is the default; Anthropic is also available.
# Bind applications → connections once, then drive a tool-calling loop
toolset = client.toolset(tools=["salesforce_getrecords"], connections={"salesforce": "Prod"})
openai_tools = client.provider.wrap_tools(toolset.tools()) # plain OpenAI tool-JSON dicts
# … send openai_tools to the model, get a response …
results = toolset.handle_tool_calls(llm_response) # runs the calls, returns results
client.toolset(...) builds a local toolset (no I/O until used) or loads a server one via
toolset_id=….
Files
Tools whose input_schema marks a field "format": "engini/file" accept files. Wrap a file
with engini.File and pass it as the field value — the SDK base64-encodes it into the
{base64_content, mime_type, filename} wire shape. A field can take a single file or a list,
per the tool's schema.
from engini import Engini, File
client = Engini(api_key="eng_…")
client.tools.execute(
"doc_summarize",
{
"document": File.from_path("report.pdf"), # single file
"attachments": [File.from_path("a.png"), File.from_path("b.png")], # list of files
},
connection_id=conn_id,
)
File.from_path infers the filename and mime type; File.from_bytes(data, filename=…, mime_type=…) and File.from_base64(…) cover in-memory content.
In the LLM loop an agent can't produce base64, so file fields are presented to it as string fields. Register the files you'll allow and let the model reference one by key:
results = toolset.handle_tool_calls(llm_response, files={"report": File.from_path("report.pdf")})
What this adds over the raw REST client
Built on the autogenerated engini-client, the SDK
adds what the generated client deliberately lacks: typed errors (the EnginiError family),
retry/backoff, auto-pagination, pluggable auth (ApiKeyAuth / BearerAuth), Provider
adapters for OpenAI/Anthropic, and the ergonomic Toolset object.
Command-line interface
The engini CLI is npm-only now: npm install -g @engini/cli. See
https://www.npmjs.com/package/@engini/cli (or ts/packages/cli/README.md in
the source repo) for install, commands, and the machine-readable output/exit-code
contract. This package (engini, PyPI) is the Python SDK only.
Source & docs: https://github.com/engini/engini-sdk
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file engini-0.11.0.tar.gz.
File metadata
- Download URL: engini-0.11.0.tar.gz
- Upload date:
- Size: 36.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
06c48fa521774afbad280817bcb4556048082e96bb3ad56b7062d28aa9a22eb0
|
|
| MD5 |
5df25330251e1fdd54d848e71bf880d5
|
|
| BLAKE2b-256 |
df9369f938cbaeb71c6778c3cadf97a7978ee67bee32db6ffb0f0dd4f67fdf2a
|
Provenance
The following attestation bundles were made for engini-0.11.0.tar.gz:
Publisher:
release-python.yml on engini/engini-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
engini-0.11.0.tar.gz -
Subject digest:
06c48fa521774afbad280817bcb4556048082e96bb3ad56b7062d28aa9a22eb0 - Sigstore transparency entry: 2475501220
- Sigstore integration time:
-
Permalink:
engini/engini-sdk@c261e2f0362fc21159612427a6c11f2fefd018da -
Branch / Tag:
refs/tags/py-sdk-v0.11.0 - Owner: https://github.com/engini
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@c261e2f0362fc21159612427a6c11f2fefd018da -
Trigger Event:
release
-
Statement type:
File details
Details for the file engini-0.11.0-py3-none-any.whl.
File metadata
- Download URL: engini-0.11.0-py3-none-any.whl
- Upload date:
- Size: 30.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2efc147b3123bf60de1612671d4c4d4354183ba823bef36d52cbc99f5bd1017
|
|
| MD5 |
f84a8434896cd789f383e1307e538148
|
|
| BLAKE2b-256 |
06609d7f18eb9b1eeb2fd73adeace06949201255edbfb6b739729809af7d7d33
|
Provenance
The following attestation bundles were made for engini-0.11.0-py3-none-any.whl:
Publisher:
release-python.yml on engini/engini-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
engini-0.11.0-py3-none-any.whl -
Subject digest:
c2efc147b3123bf60de1612671d4c4d4354183ba823bef36d52cbc99f5bd1017 - Sigstore transparency entry: 2475501250
- Sigstore integration time:
-
Permalink:
engini/engini-sdk@c261e2f0362fc21159612427a6c11f2fefd018da -
Branch / Tag:
refs/tags/py-sdk-v0.11.0 - Owner: https://github.com/engini
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@c261e2f0362fc21159612427a6c11f2fefd018da -
Trigger Event:
release
-
Statement type: