A computer
The agent gets a shell, a file system, a browser and a screen. It can install what it needs.
Summon an agent for anything.
Define a function once. Run it with a prompt and a folder,
and get back the files you asked for.
A function is one JSON file. It names the model, the tools the agent can use, the files it receives and the files it must return.
Publish it with one command. Each publish makes a new version, and every run records the version it used.
{
"provider": "prv_anthropic@latest",
"system_prompt": "You answer billing tickets.",
"tools": ["bash", "read", "write", "web_search"],
"custom_tools": [{
"name": "lookup_customer",
"url": "https://support.example/tools/customer", …
}],
"input_manifest": [
{ "path": "ticket.json", "max_bytes": 1000000 }
],
"output_manifest": [
{ "path": "reply.md", "max_bytes": 100000 },
{ "path": "actions.json", "max_bytes": 100000 }
],
"timeout_minutes": 30
}
$ jinn publish support-triage ./function.json
→ support-triage@14
Send a prompt and a folder. The agent works until the files the function names are ready. Then Jinn returns them.
If a run cannot finish, you get the reason.
Anything that can send an HTTP request can start a run. A webhook can answer a ticket. A cron job can write the Monday report. A pull request can get a review.
Each caller gets a token and calls the same API.
The agent gets a shell, a file system, a browser and a screen. It can install what it needs.
Give it up to 16 of your own HTTPS endpoints. Jinn calls each one with its own secret.
Choose Anthropic, OpenAI or xAI for each function. A new key reaches every function that uses the provider.
Send a secret once when you publish. Jinn never shows it again, in any response or log.
Every run starts with an empty workspace and your input folder. Nothing carries over from another run.
Follow a run while it works: every message, tool call and result. Logs and outputs stay for 30 days.
The CLI and your services use the same HTTP API. Start a run, follow its log and download its files.
$ jinn run support-triage \ --prompt "Ticket #4812: charged twice" \ --in ./ticket --out ./result → inv_01JQ8ZC4.1 succeeded 38.4s $ jinn logs inv_01JQ8ZC4.1 --follow $ jinn runs --function support-triage --watch
POST /v1/functions/support-triage/invocations Authorization: Bearer $JINN_TOKEN { "prompt": "Ticket #4812: charged twice", "input": "file_8f2c91…" } ← 202 { "id": "inv_01JQ8ZC4.1", "state": "queued" } GET /v1/invocations/inv_01JQ8ZC4.1 ← 200 { "state": "succeeded", "output": "https://…/out.tar" }