@jr2/orchestrator 0.4.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -2
- package/console/components/app.ts +2 -0
- package/console/components/fleet.ts +14 -1
- package/console/components/machine-pane.ts +41 -2
- package/console/main.ts +13 -1
- package/console/store.ts +102 -6
- package/console/style.css +21 -0
- package/docs/agents-block.md +5 -0
- package/docs/concepts/agents-and-turns.md +442 -0
- package/docs/concepts/architecture.md +230 -0
- package/docs/concepts/charts.md +143 -0
- package/docs/concepts/composition.md +357 -0
- package/docs/concepts/converge.md +254 -0
- package/docs/concepts/durable-runs.md +189 -0
- package/docs/concepts/effects.md +603 -0
- package/docs/concepts/gates.md +208 -0
- package/docs/concepts/machines-and-workflows.md +289 -0
- package/docs/concepts/pools-and-sources.md +230 -0
- package/docs/concepts/secrets-and-trust.md +222 -0
- package/docs/concepts/the-menu.md +378 -0
- package/docs/concepts/workspaces.md +678 -0
- package/docs/get-started/a-model-decides.md +563 -0
- package/docs/get-started/an-agent-in-a-sandbox.md +381 -0
- package/docs/get-started/connect-a-model.md +248 -0
- package/docs/get-started/create-an-instance.md +194 -0
- package/docs/get-started/have-your-assistant-write-a-machine.md +922 -0
- package/docs/get-started/install.md +126 -0
- package/docs/guides/add-tools-to-the-sandbox.md +295 -0
- package/docs/guides/answer-a-gate.md +304 -0
- package/docs/guides/bind-open-parts.md +223 -0
- package/docs/guides/cancel-a-run.md +146 -0
- package/docs/guides/clean-up.md +206 -0
- package/docs/guides/fix-a-failed-converge.md +361 -0
- package/docs/guides/give-the-cluster-git-credentials.md +222 -0
- package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
- package/docs/guides/let-an-agent-write-a-chart.md +226 -0
- package/docs/guides/look-inside-a-sandbox.md +174 -0
- package/docs/guides/mirror-the-kit-images.md +176 -0
- package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
- package/docs/guides/open-the-console.md +91 -0
- package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
- package/docs/guides/push-and-sign-a-branch.md +486 -0
- package/docs/guides/run-a-chart-by-name.md +270 -0
- package/docs/guides/run-a-command-or-call-a-url.md +544 -0
- package/docs/guides/run-one-worker-per-item.md +321 -0
- package/docs/guides/set-an-agents-access-and-dials.md +375 -0
- package/docs/guides/size-a-workspace.md +204 -0
- package/docs/guides/start-a-run-from-a-run.md +237 -0
- package/docs/guides/start-a-run.md +207 -0
- package/docs/guides/upgrade-the-kit-version.md +240 -0
- package/docs/guides/use-a-hosted-provider.md +208 -0
- package/docs/guides/use-a-local-model.md +313 -0
- package/docs/guides/watch-a-run.md +326 -0
- package/docs/guides/write-a-workflow.md +318 -0
- package/docs/index.md +44 -0
- package/docs/llms.txt +216 -0
- package/docs/reference/authoring-surface/agent.md +128 -0
- package/docs/reference/authoring-surface/answer.md +140 -0
- package/docs/reference/authoring-surface/arg.md +60 -0
- package/docs/reference/authoring-surface/basic.md +62 -0
- package/docs/reference/authoring-surface/bearer.md +53 -0
- package/docs/reference/authoring-surface/chartschema.md +23 -0
- package/docs/reference/authoring-surface/chartschemafor.md +48 -0
- package/docs/reference/authoring-surface/command.md +191 -0
- package/docs/reference/authoring-surface/customize.md +64 -0
- package/docs/reference/authoring-surface/defineconfig.md +41 -0
- package/docs/reference/authoring-surface/defineevent.md +114 -0
- package/docs/reference/authoring-surface/dispatch.md +126 -0
- package/docs/reference/authoring-surface/fail.md +83 -0
- package/docs/reference/authoring-surface/file.md +122 -0
- package/docs/reference/authoring-surface/frompick.md +277 -0
- package/docs/reference/authoring-surface/http.md +159 -0
- package/docs/reference/authoring-surface/isfailure.md +58 -0
- package/docs/reference/authoring-surface/jr2setup.md +237 -0
- package/docs/reference/authoring-surface/open.md +74 -0
- package/docs/reference/authoring-surface/openbody.md +86 -0
- package/docs/reference/authoring-surface/paramsof.md +125 -0
- package/docs/reference/authoring-surface/pool.md +186 -0
- package/docs/reference/authoring-surface/push.md +112 -0
- package/docs/reference/authoring-surface/secret.md +118 -0
- package/docs/reference/authoring-surface/sentby.md +83 -0
- package/docs/reference/authoring-surface/source.md +51 -0
- package/docs/reference/authoring-surface/text.md +62 -0
- package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
- package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
- package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
- package/docs/reference/authoring-surface/type-agentslots.md +12 -0
- package/docs/reference/authoring-surface/type-answeraction.md +12 -0
- package/docs/reference/authoring-surface/type-arg.md +19 -0
- package/docs/reference/authoring-surface/type-argnames.md +12 -0
- package/docs/reference/authoring-surface/type-binding.md +62 -0
- package/docs/reference/authoring-surface/type-bindingof.md +12 -0
- package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
- package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
- package/docs/reference/authoring-surface/type-ceilings.md +41 -0
- package/docs/reference/authoring-surface/type-chainlink.md +19 -0
- package/docs/reference/authoring-surface/type-chartaction.md +46 -0
- package/docs/reference/authoring-surface/type-chartagent.md +28 -0
- package/docs/reference/authoring-surface/type-chartevent.md +20 -0
- package/docs/reference/authoring-surface/type-chartguard.md +20 -0
- package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
- package/docs/reference/authoring-surface/type-chartjson.md +14 -0
- package/docs/reference/authoring-surface/type-chartstate.md +46 -0
- package/docs/reference/authoring-surface/type-charttext.md +40 -0
- package/docs/reference/authoring-surface/type-charttransition.md +22 -0
- package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
- package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
- package/docs/reference/authoring-surface/type-childat.md +12 -0
- package/docs/reference/authoring-surface/type-childslots.md +12 -0
- package/docs/reference/authoring-surface/type-commandenv.md +15 -0
- package/docs/reference/authoring-surface/type-commandinput.md +19 -0
- package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
- package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
- package/docs/reference/authoring-surface/type-customize.md +109 -0
- package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
- package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
- package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
- package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
- package/docs/reference/authoring-surface/type-duration.md +15 -0
- package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
- package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
- package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
- package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
- package/docs/reference/authoring-surface/type-eventdef.md +45 -0
- package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
- package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
- package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
- package/docs/reference/authoring-surface/type-failslot.md +14 -0
- package/docs/reference/authoring-surface/type-failure.md +19 -0
- package/docs/reference/authoring-surface/type-failureinput.md +20 -0
- package/docs/reference/authoring-surface/type-filebody.md +41 -0
- package/docs/reference/authoring-surface/type-frominput.md +14 -0
- package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
- package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
- package/docs/reference/authoring-surface/type-httpinput.md +12 -0
- package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
- package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
- package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
- package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
- package/docs/reference/authoring-surface/type-jr2config.md +126 -0
- package/docs/reference/authoring-surface/type-lends.md +38 -0
- package/docs/reference/authoring-surface/type-logicat.md +12 -0
- package/docs/reference/authoring-surface/type-markedif.md +12 -0
- package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
- package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
- package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
- package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
- package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
- package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
- package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
- package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
- package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
- package/docs/reference/authoring-surface/type-openeffect.md +12 -0
- package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
- package/docs/reference/authoring-surface/type-openof.md +12 -0
- package/docs/reference/authoring-surface/type-opensecret.md +23 -0
- package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
- package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
- package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
- package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
- package/docs/reference/authoring-surface/type-poolspec.md +60 -0
- package/docs/reference/authoring-surface/type-pushinput.md +15 -0
- package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
- package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
- package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
- package/docs/reference/authoring-surface/type-quantity.md +14 -0
- package/docs/reference/authoring-surface/type-reached.md +12 -0
- package/docs/reference/authoring-surface/type-reposlot.md +70 -0
- package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
- package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
- package/docs/reference/authoring-surface/type-secret.md +25 -0
- package/docs/reference/authoring-surface/type-sender.md +19 -0
- package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
- package/docs/reference/authoring-surface/type-size.md +85 -0
- package/docs/reference/authoring-surface/type-slothandles.md +32 -0
- package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
- package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
- package/docs/reference/authoring-surface/type-syncstate.md +12 -0
- package/docs/reference/authoring-surface/type-text.md +19 -0
- package/docs/reference/authoring-surface/type-textpart.md +24 -0
- package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
- package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
- package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
- package/docs/reference/authoring-surface/type-unknown.md +21 -0
- package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
- package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
- package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
- package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
- package/docs/reference/authoring-surface/type-workspaced.md +94 -0
- package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
- package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
- package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
- package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
- package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
- package/docs/reference/authoring-surface/workspace.md +259 -0
- package/docs/reference/authoring-surface.md +197 -0
- package/docs/reference/cli.md +433 -0
- package/docs/reference/config.md +756 -0
- package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
- package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
- package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
- package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
- package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
- package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
- package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
- package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
- package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
- package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
- package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
- package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
- package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
- package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
- package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
- package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
- package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
- package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
- package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
- package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
- package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
- package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
- package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
- package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
- package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
- package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
- package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
- package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
- package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
- package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
- package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
- package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
- package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
- package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
- package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
- package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
- package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
- package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
- package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
- package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
- package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
- package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
- package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
- package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
- package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
- package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
- package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
- package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
- package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
- package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
- package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
- package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
- package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
- package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
- package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
- package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
- package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
- package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
- package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
- package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
- package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
- package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
- package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
- package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +550 -0
- package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
- package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
- package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
- package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
- package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
- package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
- package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
- package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
- package/docs/reference/decisions.md +83 -0
- package/docs/reference/glossary.md +648 -0
- package/docs/reference/http-api.md +1348 -0
- package/docs/reference/machines.md +190 -0
- package/docs/reference/mechanism-events.md +72 -0
- package/docs/why.md +206 -0
- package/package.json +5 -3
- package/src/actor.ts +541 -79
- package/src/agent.ts +114 -38
- package/src/ambient.ts +2 -1
- package/src/assembly-checks.ts +189 -7
- package/src/cause.ts +234 -0
- package/src/chart.ts +169 -37
- package/src/charts.ts +34 -6
- package/src/config.ts +430 -178
- package/src/custodian.ts +74 -22
- package/src/customize.ts +188 -46
- package/src/dispatch-effect.ts +945 -0
- package/src/door-compat.ts +217 -0
- package/src/durability.ts +11 -4
- package/src/effect.ts +341 -44
- package/src/effector-wire.ts +160 -11
- package/src/fail.ts +209 -0
- package/src/harness-client.ts +541 -47
- package/src/http-effect.ts +495 -53
- package/src/http.ts +427 -16
- package/src/index.ts +60 -82
- package/src/instance.ts +68 -8
- package/src/internal.ts +84 -0
- package/src/machine-doc.ts +21 -3
- package/src/mechanism-routes.ts +168 -0
- package/src/model-keys.generated.ts +53 -0
- package/src/model-keys.ts +18 -58
- package/src/notices.ts +66 -13
- package/src/open-body.ts +159 -23
- package/src/open-effect.ts +81 -8
- package/src/open.ts +59 -6
- package/src/parts.ts +184 -13
- package/src/party.ts +68 -2
- package/src/pick.ts +463 -11
- package/src/pool.ts +247 -36
- package/src/registration.ts +83 -4
- package/src/repos.ts +2 -1
- package/src/run-host.ts +565 -31
- package/src/run-output.ts +38 -0
- package/src/sandbox-effect.ts +273 -38
- package/src/sandbox-kube.ts +3 -1
- package/src/secret-placement.ts +52 -17
- package/src/server.ts +3 -0
- package/src/setup.ts +239 -56
- package/src/size.ts +121 -9
- package/src/snapshot-store.ts +54 -10
- package/src/stub-harness.ts +44 -16
- package/src/timers.ts +14 -1
- package/src/vocabulary.ts +69 -14
- package/src/wire.ts +90 -16
- package/src/workspace.ts +697 -175
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Use a local model
|
|
3
|
+
description: Connect your Agents to a model on an OpenAI-compatible endpoint, with or without TLS and a key.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Use a local model
|
|
7
|
+
|
|
8
|
+
Connect your [Instance](../reference/glossary.md#instance) to a model that you serve yourself, on an OpenAI-compatible
|
|
9
|
+
endpoint such as vLLM or llama.cpp.
|
|
10
|
+
|
|
11
|
+
The example on this page serves Qwen3.6-35B-A3B as `qwen3.6-35b-a3b`, on port 8000, with a context window of 65536
|
|
12
|
+
tokens. The first part uses plain `http://` and no key. [Serve over TLS with a key](#serve-over-tls-with-a-key) adds TLS
|
|
13
|
+
and a key.
|
|
14
|
+
|
|
15
|
+
## Start the server
|
|
16
|
+
|
|
17
|
+
The server must obey three conditions:
|
|
18
|
+
|
|
19
|
+
- It serves the model under one name. An [Agent](../reference/glossary.md#agent) uses this name.
|
|
20
|
+
- It listens on an address that a pod can reach, such as the LAN address of your computer. `localhost` does not work
|
|
21
|
+
from a pod. Thus the server listens on `0.0.0.0`. llama.cpp listens on its loopback address by default.
|
|
22
|
+
- It completes a tool call. `jr2 up` sends one tool call to the endpoint before it converges, and stops when it fails.
|
|
23
|
+
|
|
24
|
+
To install the server, see the install page of [llama.cpp](https://github.com/ggml-org/llama.cpp) or of
|
|
25
|
+
[vLLM](https://docs.vllm.ai). Then start one of them.
|
|
26
|
+
|
|
27
|
+
### llama.cpp
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
llama-server -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q6_K_XL --alias qwen3.6-35b-a3b --no-mmproj \
|
|
31
|
+
--host 0.0.0.0 --port 8000 --jinja -c 65536 \
|
|
32
|
+
--temp 0.6 --presence-penalty 1.0 -ctk q8_0 -ctv q8_0 -fa on
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`--jinja` lets the model call tools. `--temp 0.6` and `--presence-penalty 1.0` are the sampling settings for Qwen.
|
|
36
|
+
`-ctk q8_0 -ctv q8_0 -fa on` make the KV cache smaller, so that 65536 tokens fit in memory.
|
|
37
|
+
|
|
38
|
+
### vLLM
|
|
39
|
+
|
|
40
|
+
```sh
|
|
41
|
+
vllm serve Qwen/Qwen3.6-35B-A3B --served-model-name qwen3.6-35b-a3b \
|
|
42
|
+
--host 0.0.0.0 --port 8000 --max-model-len 65536 \
|
|
43
|
+
--enable-auto-tool-choice --tool-call-parser qwen3_coder
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`--enable-auto-tool-choice` and `--tool-call-parser` let the model call tools.
|
|
47
|
+
|
|
48
|
+
## Add the provider
|
|
49
|
+
|
|
50
|
+
Add a `harness` entry to `jr2.config.ts`. It declares a custom provider with the id `local`:
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { defineConfig } from "@jr2/orchestrator";
|
|
54
|
+
|
|
55
|
+
export default defineConfig({
|
|
56
|
+
git: {
|
|
57
|
+
// The credentials that the cluster uses to clone and push. The token comes from JR2_GIT_TOKEN in .env.
|
|
58
|
+
credentials: [{ match: "*", token: "JR2_GIT_TOKEN", sshKey: "jr2-git-ssh" }],
|
|
59
|
+
},
|
|
60
|
+
harness: {
|
|
61
|
+
// An OpenAI-compatible endpoint, such as vLLM or llama.cpp. An Agent names its model as local/<model>.
|
|
62
|
+
provider: {
|
|
63
|
+
id: "local",
|
|
64
|
+
api: "openai-completions",
|
|
65
|
+
// An address that a pod can reach, from .env. With no apiKey, plain http:// is permitted.
|
|
66
|
+
baseUrl: process.env.LOCAL_MODEL_URL ?? "",
|
|
67
|
+
// The key is the name that the endpoint gives for GET /v1/models. The limits agree with the server.
|
|
68
|
+
models: { "qwen3.6-35b-a3b": { contextWindow: 65536, maxTokens: 8192 } },
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Add the address of the endpoint to `.env`. Write the LAN address of the computer that runs the server in place of
|
|
75
|
+
`<address>`:
|
|
76
|
+
|
|
77
|
+
```sh
|
|
78
|
+
LOCAL_MODEL_URL=http://<address>:8000/v1
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The fields of [`harness.provider`](../reference/config.md#harness-provider) do these things:
|
|
82
|
+
|
|
83
|
+
- `id` is the first part of each model name. An Agent names this model as `local/qwen3.6-35b-a3b`.
|
|
84
|
+
- `api` is the wire protocol. `"openai-completions"` is the only value.
|
|
85
|
+
- `baseUrl` is the endpoint. It changes from one computer to the next, so `jr2.config.ts` reads it from `.env`.
|
|
86
|
+
- `models` holds the token limits of each model. Its key is the name that the endpoint gives for `GET /v1/models`.
|
|
87
|
+
|
|
88
|
+
Set `contextWindow` to the context of the server: `-c` for llama.cpp, `--max-model-len` for vLLM. A limit that nothing
|
|
89
|
+
sets is 0. Then [Compaction](../reference/glossary.md#compaction) has no context budget.
|
|
90
|
+
|
|
91
|
+
## Name the model in an Agent
|
|
92
|
+
|
|
93
|
+
An Agent names the model in the `model` field of its definition, as `<provider>/<modelId>`: `"local/qwen3.6-35b-a3b"`.
|
|
94
|
+
See [`agent()`](../reference/authoring-surface/agent.md) for the other fields of the definition.
|
|
95
|
+
|
|
96
|
+
## Run jr2 up
|
|
97
|
+
|
|
98
|
+
```sh
|
|
99
|
+
jr2 up
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`jr2 up` starts a pod in the cluster, on the nodes where the Agents that name the model run. The pod asks the endpoint
|
|
103
|
+
for one tool call for each model, as a Turn asks. You see these lines when the Agent is a `workspace: "none"` Agent:
|
|
104
|
+
|
|
105
|
+
```text
|
|
106
|
+
…
|
|
107
|
+
provider: checking local/qwen3.6-35b-a3b on the Instance Harness, with no held key (harness.provider has no apiKey), direct, as a pod that holds no secret calls it
|
|
108
|
+
provider: the check pod has up to 5 min to start, then up to 6 min for its model
|
|
109
|
+
provider: the check pod is not running yet — custodian: PodInitializing
|
|
110
|
+
provider: the check pod is not running yet — check: PodInitializing
|
|
111
|
+
provider: local/qwen3.6-35b-a3b reachable, and it completed a tool call
|
|
112
|
+
…
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
While the check pod starts, `jr2 up` prints a `the check pod is not running yet` line for each change of its state. Your
|
|
116
|
+
output can have fewer of these lines, or more.
|
|
117
|
+
|
|
118
|
+
`jr2 up` checks each model of the provider that an Agent names. When no Agent names a model of the provider, it checks
|
|
119
|
+
nothing and prints this line:
|
|
120
|
+
|
|
121
|
+
```text
|
|
122
|
+
provider: http://<address>:8000/v1 configured, but no carried Agent names a "local/…" model — skipped
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Serve over TLS with a key
|
|
126
|
+
|
|
127
|
+
The server listens on `0.0.0.0`, so each device on your network can use it. A key stops this. The key is a
|
|
128
|
+
[Held secret](../reference/glossary.md#held-secret). The [Harness](../reference/glossary.md#harness) container holds
|
|
129
|
+
only its [Stand-in](../reference/glossary.md#stand-in). The [Custodian](../reference/glossary.md#custodian) of the pod
|
|
130
|
+
puts the key into the requests. The Custodian sends a key over TLS only. Thus a key needs an `https://` endpoint, and
|
|
131
|
+
the cluster must trust its certificate.
|
|
132
|
+
|
|
133
|
+
### Make a key
|
|
134
|
+
|
|
135
|
+
Make a random key:
|
|
136
|
+
|
|
137
|
+
```sh
|
|
138
|
+
openssl rand -hex 32
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Put the key in `.env`. Change the address to `https://`:
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
LOCAL_MODEL_URL=https://<address>:8000/v1
|
|
145
|
+
LOCAL_MODEL_API_KEY=<key>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Make a CA and a certificate
|
|
149
|
+
|
|
150
|
+
`jr2 up` puts each file of the Instance folder into the image of the
|
|
151
|
+
[Orchestrator](../reference/glossary.md#orchestrator). It leaves out only `node_modules`, `.git`, `.jr2`, `.npmrc`,
|
|
152
|
+
`.env` and `.env.*`. Thus, do not put a private key in the Instance folder. These commands put the keys in
|
|
153
|
+
`~/local-model-certs`, and copy only the CA certificate into the Instance folder.
|
|
154
|
+
|
|
155
|
+
Run these commands in the Instance folder. Write the IP address of `LOCAL_MODEL_URL` in place of each `<address>`:
|
|
156
|
+
|
|
157
|
+
```sh
|
|
158
|
+
mkdir -p ~/local-model-certs certs
|
|
159
|
+
openssl req -x509 -newkey rsa:2048 -nodes -days 3650 -subj "/CN=local model CA" \
|
|
160
|
+
-keyout ~/local-model-certs/ca.key -out ~/local-model-certs/ca.crt
|
|
161
|
+
openssl req -newkey rsa:2048 -nodes -subj "/CN=<address>" \
|
|
162
|
+
-keyout ~/local-model-certs/server.key -out ~/local-model-certs/server.csr
|
|
163
|
+
printf "subjectAltName=IP:<address>\nextendedKeyUsage=serverAuth\n" > ~/local-model-certs/ext.cnf
|
|
164
|
+
openssl x509 -req -in ~/local-model-certs/server.csr -CA ~/local-model-certs/ca.crt \
|
|
165
|
+
-CAkey ~/local-model-certs/ca.key -CAcreateserial -days 365 \
|
|
166
|
+
-extfile ~/local-model-certs/ext.cnf -out ~/local-model-certs/server.crt
|
|
167
|
+
cp ~/local-model-certs/ca.crt certs/ca.crt
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
The commands make a CA (`ca.crt`) and a certificate for the server (`server.crt`), which the CA signs. For a DNS name in
|
|
171
|
+
`LOCAL_MODEL_URL`, write `DNS:<name>` in place of `IP:<address>`.
|
|
172
|
+
|
|
173
|
+
Commit `certs/ca.crt`, because a CA certificate is public. Keep `ca.key` and `server.key` in `~/local-model-certs`. If
|
|
174
|
+
the server runs on a different computer, copy `server.key` and `server.crt` to `~/local-model-certs` on that computer.
|
|
175
|
+
On that computer, set `LOCAL_MODEL_API_KEY` to the same key before you start the server.
|
|
176
|
+
|
|
177
|
+
### Start the server with TLS and the key
|
|
178
|
+
|
|
179
|
+
Stop the server that you started without TLS. The new server uses the same port.
|
|
180
|
+
|
|
181
|
+
Load `.env` into your shell, so that the server gets the key:
|
|
182
|
+
|
|
183
|
+
```sh
|
|
184
|
+
set -a && . ./.env && set +a
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Then start the server with its certificate. The server reads the key from an environment variable, not from its command
|
|
188
|
+
line, so the process list does not show the key. For llama.cpp:
|
|
189
|
+
|
|
190
|
+
```sh
|
|
191
|
+
LLAMA_API_KEY="$LOCAL_MODEL_API_KEY" llama-server -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q6_K_XL \
|
|
192
|
+
--alias qwen3.6-35b-a3b --no-mmproj --host 0.0.0.0 --port 8000 --jinja -c 65536 \
|
|
193
|
+
--temp 0.6 --presence-penalty 1.0 -ctk q8_0 -ctv q8_0 -fa on \
|
|
194
|
+
--ssl-key-file ~/local-model-certs/server.key --ssl-cert-file ~/local-model-certs/server.crt
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
For vLLM:
|
|
198
|
+
|
|
199
|
+
```sh
|
|
200
|
+
VLLM_API_KEY="$LOCAL_MODEL_API_KEY" vllm serve Qwen/Qwen3.6-35B-A3B --served-model-name qwen3.6-35b-a3b \
|
|
201
|
+
--host 0.0.0.0 --port 8000 --max-model-len 65536 \
|
|
202
|
+
--enable-auto-tool-choice --tool-call-parser qwen3_coder \
|
|
203
|
+
--ssl-keyfile ~/local-model-certs/server.key --ssl-certfile ~/local-model-certs/server.crt
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Change the provider
|
|
207
|
+
|
|
208
|
+
Add `apiKey` to `harness.provider`. Add `caBundle` to `harness`:
|
|
209
|
+
|
|
210
|
+
```ts
|
|
211
|
+
import { defineConfig } from "@jr2/orchestrator";
|
|
212
|
+
|
|
213
|
+
export default defineConfig({
|
|
214
|
+
git: {
|
|
215
|
+
// The credentials that the cluster uses to clone and push. The token comes from JR2_GIT_TOKEN in .env.
|
|
216
|
+
credentials: [{ match: "*", token: "JR2_GIT_TOKEN", sshKey: "jr2-git-ssh" }],
|
|
217
|
+
},
|
|
218
|
+
harness: {
|
|
219
|
+
// An OpenAI-compatible endpoint, such as vLLM or llama.cpp. An Agent names its model as local/<model>.
|
|
220
|
+
provider: {
|
|
221
|
+
id: "local",
|
|
222
|
+
api: "openai-completions",
|
|
223
|
+
// An https:// address that a pod can reach, from .env. A key needs https://.
|
|
224
|
+
baseUrl: process.env.LOCAL_MODEL_URL ?? "",
|
|
225
|
+
// The key that the server asks for, from .env. Only the Custodian of a pod gets its value.
|
|
226
|
+
apiKey: process.env.LOCAL_MODEL_API_KEY,
|
|
227
|
+
// The key is the name that the endpoint gives for GET /v1/models. The limits agree with the server.
|
|
228
|
+
models: { "qwen3.6-35b-a3b": { contextWindow: 65536, maxTokens: 8192 } },
|
|
229
|
+
},
|
|
230
|
+
// The CA that signed the server's certificate, relative to this folder. Commit it: a CA certificate is public.
|
|
231
|
+
caBundle: "certs/ca.crt",
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
[`harness.provider.apiKey`](../reference/config.md#harness-provider-apikey) becomes the Held secret
|
|
237
|
+
`JR2_PROVIDER_API_KEY`. `jr2 up` binds it to the host and port of `baseUrl`, and the Custodian sends it to no other
|
|
238
|
+
host.
|
|
239
|
+
|
|
240
|
+
[`harness.caBundle`](../reference/config.md#harness-cabundle) is a path to a PEM file, relative to the Instance folder.
|
|
241
|
+
`jr2 up` puts the file in the `jr2-ca` ConfigMap. The check of the endpoint, the Harness container and the Custodian
|
|
242
|
+
trust it. An `https://` endpoint whose certificate comes from a private CA needs `caBundle` also when it needs no key.
|
|
243
|
+
|
|
244
|
+
### Run jr2 up again
|
|
245
|
+
|
|
246
|
+
```sh
|
|
247
|
+
jr2 up
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
```text
|
|
251
|
+
…
|
|
252
|
+
the Instance Harness: Custodian holds JR2_PROVIDER_API_KEY (provider)
|
|
253
|
+
held secret JR2_PROVIDER_API_KEY → <address>:8000 (literal)
|
|
254
|
+
held secrets: minted the Instance's CA into jr2-held-ca
|
|
255
|
+
provider: checking local/qwen3.6-35b-a3b on the Instance Harness, through a Custodian that holds JR2_PROVIDER_API_KEY for <address>:8000
|
|
256
|
+
provider: the check pod has up to 5 min to start, then up to 6 min for its model
|
|
257
|
+
provider: the check pod is not running yet — custodian: PodInitializing
|
|
258
|
+
provider: local/qwen3.6-35b-a3b reachable, and it completed a tool call
|
|
259
|
+
…
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
The Custodian of the Instance Harness holds the key. `jr2 up` prints the `held secrets:` line when the namespace has no
|
|
263
|
+
CA for the Custodians yet, as on the first `jr2 up` with a Held secret.
|
|
264
|
+
|
|
265
|
+
To change the key, edit `.env`. Then start the server again. Then run `jr2 up` again. When a Menu-only Agent names the
|
|
266
|
+
model, `jr2 up` restarts the [Instance Harness](../reference/glossary.md#instance-harness) with the new key. A live
|
|
267
|
+
[Sandbox](../reference/glossary.md#sandbox) keeps the old key, so its calls to the server fail after the restart. A
|
|
268
|
+
Sandbox that starts after `jr2 up` gets the new key.
|
|
269
|
+
|
|
270
|
+
## Rules
|
|
271
|
+
|
|
272
|
+
`jr2 up` prints each refusal after `error: `.
|
|
273
|
+
|
|
274
|
+
- `jr2 up` stops when the check of the endpoint fails. A pod in the cluster asks the endpoint for one tool call for each
|
|
275
|
+
model, as a Turn asks. The pod has a Custodian, so a key in `apiKey` is held as in a Harness pod. The first line gives
|
|
276
|
+
the error. The other lines are the usual causes:
|
|
277
|
+
|
|
278
|
+
```text
|
|
279
|
+
provider preflight failed for model "<model>" against <host> (from a pod on <where>, as a Turn calls it): <error>
|
|
280
|
+
- localhost never works from a pod; use a LAN address
|
|
281
|
+
- the model id must be exactly what the endpoint serves (vLLM: GET /v1/models)
|
|
282
|
+
- vLLM needs --enable-auto-tool-choice and a matching --tool-call-parser
|
|
283
|
+
- stop reason "length" means the model ran out of tokens before the call (a thinking model reasons first)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
- When an Agent names a model of the provider, `jr2 up` refuses a key with an endpoint that is not `https://`:
|
|
287
|
+
`harness.provider.apiKey is set, and harness.provider.baseUrl is not https:// — the key is a held secret and the Custodian carries TLS only (ADR-0059). Serve the endpoint over TLS (and name its CA in harness.caBundle), or drop apiKey for an endpoint that needs none.`
|
|
288
|
+
- `jr2 up` refuses a `caBundle` that it cannot read:
|
|
289
|
+
`harness.caBundle names "<path>" but <file> is not readable — the path is relative to the instance folder; commit the PEM bundle there (CA certs are public)`.
|
|
290
|
+
- While a Held secret exists, `jr2 up` refuses a proxy or trust variable in `harness.env`, such as
|
|
291
|
+
`NODE_EXTRA_CA_CERTS`. Put the CA in `caBundle`:
|
|
292
|
+
`harness.env[<i>] sets <NAME>, which the Custodian owns while a held secret exists — it cannot chain to another proxy or trust store yet. Drop the entry; put a private CA in harness.caBundle (ADR-0059).`
|
|
293
|
+
- `jr2 up` warns about a key when no Agent names a model of the provider:
|
|
294
|
+
`warning: harness.provider.apiKey is named by nothing; goes nowhere — no Agent names a "<id>/…" model (ADR-0059)`.
|
|
295
|
+
- `jr2 up` refuses an `api` other than `"openai-completions"` before it builds or applies anything:
|
|
296
|
+
`refusing: harness.provider.api is "<api>" — the Harness speaks: openai-completions (ADR-0018)`.
|
|
297
|
+
- `harness.provider.id` must not also be a key of `harness.catalog`. `jr2 up` refuses it:
|
|
298
|
+
`harness.catalog.<id>: "<id>" is also harness.provider.id — a custom provider owns its own baseUrl; rename the custom provider or drop the catalog entry (ADR-0059)`.
|
|
299
|
+
|
|
300
|
+
## Read next
|
|
301
|
+
|
|
302
|
+
- [Secrets and trust](../concepts/secrets-and-trust.md): Held secrets, Stand-ins and the Custodian.
|
|
303
|
+
- [Connect a model](../get-started/connect-a-model.md): the tutorial step that adds this provider.
|
|
304
|
+
- [Use a hosted provider or a gateway](use-a-hosted-provider.md): a model from the model catalog.
|
|
305
|
+
- [`harness.provider`](../reference/config.md#harness-provider) and
|
|
306
|
+
[`harness.caBundle`](../reference/config.md#harness-cabundle) in the `jr2.config.ts` Reference.
|
|
307
|
+
- [ADR-0018](../reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md): an Agent names
|
|
308
|
+
its model, and the config declares what the Harness can reach.
|
|
309
|
+
- [ADR-0019](../reference/decisions/0019-one-converging-command-against-the-current-context.md): `jr2 up` checks the
|
|
310
|
+
endpoint from inside the cluster.
|
|
311
|
+
- [ADR-0020](../reference/decisions/0020-private-ca-trust-is-a-named-concept.md): `caBundle`.
|
|
312
|
+
- [ADR-0059](../reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md): the Custodian
|
|
313
|
+
holds the key.
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Watch a run
|
|
3
|
+
description: "See where a run is and what its Agents do: in the CLI, in the Console, and in the pod log."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Watch a run
|
|
7
|
+
|
|
8
|
+
See where a run is and what its [Agents](../reference/glossary.md#agent) do, in the CLI, the
|
|
9
|
+
[Console](../reference/glossary.md#console) and the pod log of an Agent.
|
|
10
|
+
|
|
11
|
+
The CLI shows the status of a run: where its [Machine](../reference/glossary.md#machine) is, its context, and its open
|
|
12
|
+
[Gates](../reference/glossary.md#gate). The Console shows where the Machine is and, with the Instance token, the open
|
|
13
|
+
Gates. The pod log shows the conversation of each Agent: its prompts, its text, and its calls.
|
|
14
|
+
|
|
15
|
+
The examples on this page use a run of the [Workflow](../reference/glossary.md#workflow) `release`. Its Gate `review`
|
|
16
|
+
waits for `approve` or `reject`. [Answer a Gate](answer-a-gate.md) gives the file `workflows/release.ts`. In the
|
|
17
|
+
commands, replace these values:
|
|
18
|
+
|
|
19
|
+
- `<namespace>`: the namespace of your [Instance](../reference/glossary.md#instance). It is the
|
|
20
|
+
[`name`](../reference/config.md#name) in `jr2.config.ts`. When `jr2.config.ts` sets no `name`, it is the name of the
|
|
21
|
+
Instance folder.
|
|
22
|
+
- `<run id>`: the run id, or its first 4 characters or more. `jr2 run` prints the run id in the line
|
|
23
|
+
`run <run id> (<workflow>) — attached`. `kubectl` and the HTTP routes need the full run id.
|
|
24
|
+
|
|
25
|
+
Give each `jr2` command in the Instance folder.
|
|
26
|
+
|
|
27
|
+
## Start a run to watch
|
|
28
|
+
|
|
29
|
+
Start a run of `release` with `--detach`. `jr2 run` prints the run id and returns, and the run waits at the Gate:
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
jr2 run release --input '{"version":"2.0.0"}' --detach
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
→ context <context> / namespace <namespace>
|
|
37
|
+
{"runId":"a2d8b5b5-645c-44d2-8175-a949493e2320"}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Your run ids, instance ids and `assembly` hash are different from the values on this page.
|
|
41
|
+
|
|
42
|
+
## List the live runs
|
|
43
|
+
|
|
44
|
+
Run [`jr2 runs`](../reference/cli.md#runs):
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
jr2 runs
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
→ context <context> / namespace <namespace>
|
|
52
|
+
workflows:
|
|
53
|
+
ping (machine)
|
|
54
|
+
release (machine)
|
|
55
|
+
[{"runId":"a2d8b5b5-645c-44d2-8175-a949493e2320","workflow":"release","instanceId":"6242963e-76d0-4acd-ac86-09359a29912f","status":"active","value":"review","context":{"version":"2.0.0"},"children":[],"waiting":[],"held":[],"assembly":"28c844453c20"}]
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`jr2 runs` prints a JSON array of the runs that did not end. On stderr, it first lists the Workflows that a run can
|
|
59
|
+
start, each with where it comes from: `machine`, `chart file` or `chart`. A Chart wrapper lists its named Charts under
|
|
60
|
+
it. `jr2 runs --workflows` prints that list as the JSON result. To read a run that ended, use `jr2 status <run id>`. A
|
|
61
|
+
run with a [Workspace](../reference/glossary.md#workspace) that waits for capacity also has `placing`: the path of each
|
|
62
|
+
such Workspace in the run. `jr2 status` tells why it waits. A run that a `dispatch`
|
|
63
|
+
[Effect](../reference/glossary.md#effect) started has `dispatchedBy` after its id: the run that started it, the slot of
|
|
64
|
+
the Effect, the id of the Effect (`effect`), and its `depth` in the chain.
|
|
65
|
+
[Start a run from a run](start-a-run-from-a-run.md) shows it.
|
|
66
|
+
|
|
67
|
+
## Read the status of a run
|
|
68
|
+
|
|
69
|
+
Run [`jr2 status`](../reference/cli.md#status) with the run id. It reads a run that ended too:
|
|
70
|
+
|
|
71
|
+
```sh
|
|
72
|
+
jr2 status a2d8
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
→ context <context> / namespace <namespace>
|
|
77
|
+
{"runId":"a2d8b5b5-645c-44d2-8175-a949493e2320","workflow":"release","instanceId":"6242963e-76d0-4acd-ac86-09359a29912f","status":"active","value":"review","context":{"version":"2.0.0"},"children":[],"waiting":[],"held":[],"assembly":"28c844453c20","gates":[{"gate":"review","path":["review"],"accepts":[{"name":"approve","description":"Release this version.","input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}},{"name":"reject","description":"Do not release this version. Say why.","input":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"reason":{"type":"string"}},"required":["reason"],"additionalProperties":false}}],"acceptsNow":["approve","reject"],"meta":{"version":"2.0.0"}}]}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The status is a [`RunStatus`](../reference/http-api.md#type-runstatus), with the open Gates of the run:
|
|
81
|
+
|
|
82
|
+
| Field | What it holds |
|
|
83
|
+
| ---------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
|
84
|
+
| `status` | `active` while the run continues. `done`, `failed`, `error` or `cancelled` when it ended. `drifted` when jr2 did not continue it. |
|
|
85
|
+
| `value` | The state of the root Machine. |
|
|
86
|
+
| `context` | The context of the root Machine. |
|
|
87
|
+
| `children` | The Machines that the run invokes now, such as its Workspaces, each with its state. |
|
|
88
|
+
| `waiting` | Each Workspace that waits for capacity: what it waits for, since when, and the words of the scheduler or the quota. |
|
|
89
|
+
| `held` | Each [outstanding](../reference/glossary.md#outstanding) pick of an Agent: the Agent, the pick, and since when. |
|
|
90
|
+
| `fault` | The error, when the status is `error`. |
|
|
91
|
+
| `output` | The output of the Machine, when the run ended. For `failed`, the Failure: `{ reason, detail? }`. |
|
|
92
|
+
| `reason` | Why jr2 set the status, when the Machine did not set it, such as `drifted`. |
|
|
93
|
+
| `assembly` | The hash of the [Assembly](../reference/glossary.md#assembly) that the run started under, and holds. |
|
|
94
|
+
| `gates` | Each open Gate. [Answer a Gate](answer-a-gate.md) explains its fields. |
|
|
95
|
+
|
|
96
|
+
[Durable runs](../concepts/durable-runs.md) tells how long jr2 keeps a run that ended.
|
|
97
|
+
|
|
98
|
+
`jr2 status` with no run id does not read a run. It prints the current Assembly, each Assembly that a live run holds,
|
|
99
|
+
and the [Repos](../reference/glossary.md#repo) of the Instance.
|
|
100
|
+
|
|
101
|
+
## Follow a run
|
|
102
|
+
|
|
103
|
+
Run [`jr2 logs`](../reference/cli.md#logs) with `-f`. It prints the status now, then each change, until the run ends:
|
|
104
|
+
|
|
105
|
+
```sh
|
|
106
|
+
jr2 logs -f a2d8
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
While `jr2 logs -f` runs, send `approve` to the Gate in a second terminal:
|
|
110
|
+
|
|
111
|
+
```sh
|
|
112
|
+
jr2 send a2d8 --gate review --event approve
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
The run ends. `jr2 logs -f` prints the status when it attached, then the last status, and stops:
|
|
116
|
+
|
|
117
|
+
```text
|
|
118
|
+
→ context <context> / namespace <namespace>
|
|
119
|
+
{"runId":"a2d8b5b5-645c-44d2-8175-a949493e2320","workflow":"release","instanceId":"6242963e-76d0-4acd-ac86-09359a29912f","status":"active","value":"review","context":{"version":"2.0.0"},"children":[],"waiting":[],"held":[],"assembly":"28c844453c20"}
|
|
120
|
+
{"runId":"a2d8b5b5-645c-44d2-8175-a949493e2320","workflow":"release","instanceId":"6242963e-76d0-4acd-ac86-09359a29912f","status":"done","value":"released","context":{"version":"2.0.0"},"children":[],"waiting":[],"held":[],"assembly":"28c844453c20"}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
When the run ended before you attach, `jr2 logs -f` prints only its last status. Without `-f`, `jr2 logs` prints the
|
|
124
|
+
status now, and stops. `jr2 logs` exits with `0` when it reads the run, also when the run ended with the status `error`.
|
|
125
|
+
Read `status` in the last line.
|
|
126
|
+
|
|
127
|
+
`jr2 logs` prints each status as one JSON line on stdout. It prints the other activity of the run on stderr, one line
|
|
128
|
+
for each item of activity:
|
|
129
|
+
|
|
130
|
+
| Line | What happened |
|
|
131
|
+
| ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
|
132
|
+
| `emit <emit>` | The Machine sent an [Emit](../reference/glossary.md#emit). `<emit>` is its JSON. |
|
|
133
|
+
| `retry <child> attempt <n> (<reason>)` | jr2 tries a [Turn](../reference/glossary.md#turn) of an Agent again. `<child>` names its Machine. `<reason>` says why. |
|
|
134
|
+
| `placing <child>: waits for a node — <message>` | The [Sandbox](../reference/glossary.md#sandbox) of a Workspace waits for a node. With a quota, the line says `waits for quota`. |
|
|
135
|
+
| `placed <child> after <n>s` | The Sandbox got its node after `<n>` seconds. |
|
|
136
|
+
| ``child-error: `<child>` failed below <agent>'s pick `<pick>` — <error>`` | A child that an Agent's pick started failed. The Agent does not get this error. |
|
|
137
|
+
|
|
138
|
+
A line about the root Workspace of the run has no `<child>`. `jr2 run` prints the same lines, with two spaces before
|
|
139
|
+
each line. It prints each change of status as `→ <status> <state>`.
|
|
140
|
+
|
|
141
|
+
## Watch in the Console
|
|
142
|
+
|
|
143
|
+
[Open the Console](open-the-console.md) tells how to open it. With no token, the Console shows each run and its state:
|
|
144
|
+
|
|
145
|
+
- The Fleet rail on the left lists each Workflow. Click the name of a Workflow, or click `▸` beside it, to see its runs.
|
|
146
|
+
Each run shows the first 8 characters of its id and its status.
|
|
147
|
+
- Click a run. The diagram of its Machine shows the states that the run is in now.
|
|
148
|
+
- The `Activity` tab in the drawer lists the Emits of the runs of the Workflow that you selected. Each Emit shows the
|
|
149
|
+
first 8 characters of the run id, and only the type of the Emit.
|
|
150
|
+
|
|
151
|
+
To see more, type the Instance token in the `instance token` box in the nav. Push Enter. When the badge beside the box
|
|
152
|
+
shows `live`:
|
|
153
|
+
|
|
154
|
+
- In the Fleet rail, `⚑` and a number show the open Gates of each run.
|
|
155
|
+
- The `Attention` tab shows the open Gates, and you can answer them. See [Answer a Gate](answer-a-gate.md).
|
|
156
|
+
- For the run that you selected, the Console shows each Workspace that waits for capacity, and why. It also shows each
|
|
157
|
+
outstanding pick of an Agent, and since when.
|
|
158
|
+
- For a run that you selected that ended `failed`, the Console shows the reason of its
|
|
159
|
+
[Failure](../reference/glossary.md#failure): `failed: <reason>`, as `jr2 status` shows it. With no token, the rail
|
|
160
|
+
shows only the status `failed`, in orange.
|
|
161
|
+
|
|
162
|
+
## Watch from a program
|
|
163
|
+
|
|
164
|
+
The [Orchestrator](../reference/glossary.md#orchestrator) sends the activity of a run as Server-Sent Events. A program
|
|
165
|
+
can read them:
|
|
166
|
+
|
|
167
|
+
| Route | Token | What it sends |
|
|
168
|
+
| ---------------------------------------------------------------------------------------------------------- | -------------- | ---------------------------------------------------------------------------------------- |
|
|
169
|
+
| [`GET /runs/:runId/events`](../reference/http-api.md#get-runs-runid-events) | Instance token | The full status of one run, its Emits, and its other activity, until it ends. |
|
|
170
|
+
| [`GET /workflows/:name/runs/:runId/events`](../reference/http-api.md#get-workflows-name-runs-runid-events) | none | The state of one live run, and the type of each Emit, with no context. |
|
|
171
|
+
| [`GET /workflows/:name/events`](../reference/http-api.md#get-workflows-name-events) | none | A `runs` event with all the live runs, then the same events for each run. It stays open. |
|
|
172
|
+
|
|
173
|
+
The run of the steps above ended, and a feed of one run sends only a live run. Start a new run:
|
|
174
|
+
|
|
175
|
+
```sh
|
|
176
|
+
jr2 run release --input '{"version":"2.0.0"}' --detach
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
```text
|
|
180
|
+
→ context <context> / namespace <namespace>
|
|
181
|
+
{"runId":"2a009f09-13d4-44ba-9e17-fd665acc7aa8"}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
To read its feed, forward a port to the Orchestrator, as [Start a run](start-a-run.md#start-a-run-with-the-http-api)
|
|
185
|
+
shows. Then use the full run id of the new run:
|
|
186
|
+
|
|
187
|
+
```sh
|
|
188
|
+
curl -s -N http://localhost:4000/workflows/release/runs/<run id>/events
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
While `curl` runs, send `approve` to the Gate in a second terminal:
|
|
192
|
+
|
|
193
|
+
```sh
|
|
194
|
+
jr2 send <run id> --gate review --event approve
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
The feed sends the status when you attached, then the last status, and closes:
|
|
198
|
+
|
|
199
|
+
```text
|
|
200
|
+
event: status
|
|
201
|
+
data: {"runId":"2a009f09-13d4-44ba-9e17-fd665acc7aa8","workflow":"release","status":"active","value":"review","children":[]}
|
|
202
|
+
|
|
203
|
+
event: status
|
|
204
|
+
data: {"runId":"2a009f09-13d4-44ba-9e17-fd665acc7aa8","workflow":"release","status":"done","value":"released","children":[]}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The first event is the status when you attach. The feed of one run closes when the run ends. While the run waits, the
|
|
208
|
+
feed also sends a comment line, `:`, at intervals, to keep the connection open.
|
|
209
|
+
|
|
210
|
+
## Read an Agent's conversation
|
|
211
|
+
|
|
212
|
+
The [Harness](../reference/glossary.md#harness) that runs an Agent's Turn prints the conversation to the log of its
|
|
213
|
+
container, `harness`. Read it with `kubectl logs`. Add `-f` to follow it.
|
|
214
|
+
|
|
215
|
+
For a [Menu](../reference/glossary.md#menu)-only Agent, an Agent with `workspace: "none"`, read the log of the
|
|
216
|
+
[Instance Harness](../reference/glossary.md#instance-harness):
|
|
217
|
+
|
|
218
|
+
```sh
|
|
219
|
+
kubectl -n <namespace> logs -f statefulset/jr2-instance-harness -c harness
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
The Instance Harness runs the Turns of all the Menu-only Agents of the Instance. Thus its log can hold the lines of more
|
|
223
|
+
than one run. Each line of a conversation holds its Instance ID, which starts with the run id. To read the lines of one
|
|
224
|
+
run, keep the lines that hold `[<run id>/`:
|
|
225
|
+
|
|
226
|
+
```sh
|
|
227
|
+
kubectl -n <namespace> logs statefulset/jr2-instance-harness -c harness | grep -F '[<run id>/'
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
For an Agent that works in a Workspace, read the log of its Sandbox. Find the Sandbox with the full run id, as
|
|
231
|
+
[Look inside a Sandbox](look-inside-a-sandbox.md) shows. The pod has the name of the Sandbox:
|
|
232
|
+
|
|
233
|
+
```sh
|
|
234
|
+
kubectl -n <namespace> get sandboxes -l jr2.dev/run=<run id>
|
|
235
|
+
kubectl -n <namespace> logs -f <sandbox> -c harness
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
For example, this is the log of a run of the `task` Workflow of
|
|
239
|
+
[An Agent in a Sandbox](../get-started/an-agent-in-a-sandbox.md), with the prompt
|
|
240
|
+
``In docs/intro/repo, run `node bin/greet.js`. Then finish, with what it printed.``:
|
|
241
|
+
|
|
242
|
+
```text
|
|
243
|
+
jr2 harness serving on :8080
|
|
244
|
+
[run] [status] running · body: working
|
|
245
|
+
[run] [status] running · body: working
|
|
246
|
+
[coder] [19b49b58-2ea4-4d79-b100-49aad6e12013/body/coder] [prompt] In docs/intro/repo, run `node bin/greet.js`. Then finish, with what it printed.
|
|
247
|
+
[coder] [19b49b58-2ea4-4d79-b100-49aad6e12013/body/coder]
|
|
248
|
+
[coder] [19b49b58-2ea4-4d79-b100-49aad6e12013/body/coder] Work in /work/target/jr2-task-19b49b58-2ea4-4d79-b100-49aad6e12013, on branch jr2/task-19b49b58-2ea4-4d79-b100-49aad6e12013 — your tools are rooted there, so a relative path lands inside it. Commit what you do there, then call finish.
|
|
249
|
+
…
|
|
250
|
+
[coder] [19b49b58-2ea4-4d79-b100-49aad6e12013/body/coder] [thinking] The user wants me to run `node bin/greet.js` inside `docs/intro/repo` directory. Let me navigate there and run it.
|
|
251
|
+
…
|
|
252
|
+
[coder] [19b49b58-2ea4-4d79-b100-49aad6e12013/body/coder] [bash] cd docs/intro/repo && node bin/greet.js
|
|
253
|
+
[coder] [19b49b58-2ea4-4d79-b100-49aad6e12013/body/coder] [thinking] The script printed "hello, world". I should now finish with this summary.
|
|
254
|
+
…
|
|
255
|
+
[coder] [19b49b58-2ea4-4d79-b100-49aad6e12013/body/coder] [finish] {"summary":"Ran `node bin/greet.js` in docs/intro/repo, which printed: hello, world"}
|
|
256
|
+
[coder] [19b49b58-2ea4-4d79-b100-49aad6e12013/body/coder] [finish answer] Delivered "finish" to the workflow (delivery afe6340b-fe10-4819-b545-8ebd1b9a3964). The workflow consumed it and moved on: your turn is over.
|
|
257
|
+
[run] [status] running · body: review
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
The thinking, the calls and the text are the words of the model, so your log is different. Your ids are different too.
|
|
261
|
+
|
|
262
|
+
Each line of a conversation starts with the name of the Agent in brackets, then the
|
|
263
|
+
[Instance ID](../reference/glossary.md#instance-id) of the conversation in brackets. The Instance ID starts with the run
|
|
264
|
+
id. The first line of each message then has a label in brackets. The next lines of the same message have no label:
|
|
265
|
+
|
|
266
|
+
| Line | What it shows |
|
|
267
|
+
| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
268
|
+
| `[<agent>] [<iid>] [prompt] <text>` | A message that the model reads: the prompt of the Turn, or a message that jr2 adds to the Turn. |
|
|
269
|
+
| `[<agent>] [<iid>] [thinking] <text>` | The thinking of the model. |
|
|
270
|
+
| `[<agent>] [<iid>] [text] <text>` | The text of the model. |
|
|
271
|
+
| `[<agent>] [<iid>] [<call>] <input>` | A call of a [Working tool](../reference/glossary.md#working-tools), or a pick from the Menu. `<input>` is a path for read, write and edit, the command for `bash`, or else JSON. |
|
|
272
|
+
| `[<agent>] [<iid>] [<pick> answer] <text>` | The answer that the model got for a pick from its Menu. |
|
|
273
|
+
| `[<agent>] [<iid>] [<pick> error] <text>` | An answer to a pick that the model reads as an error, such as a refusal. |
|
|
274
|
+
| `[<agent>] [<iid>] [compacted] <text>` | The Harness made the context of the conversation smaller: `context <before> → ~<after> tokens (window <window>)`. |
|
|
275
|
+
| `[<agent>] [<iid>] [thinking level] <text>` | The model has no thinking level of the name that the Turn asked for, and the line names the level that the model ran at. The Harness prints it one time for each Turn. |
|
|
276
|
+
|
|
277
|
+
The log of a Sandbox also tells the story of its run, in lines that start with `[run]`. `[run] [status] <state>` gives
|
|
278
|
+
the state of the run, then the state of each Machine that it invokes, separated by `·`, such as
|
|
279
|
+
`running · body: working`. When the run ends, the line gives its status. `[run] [emit] <type> <payload>` gives an Emit.
|
|
280
|
+
A Turn that runs in a different Harness shows only as `[<agent>] [admitted] <prompt>` and
|
|
281
|
+
`[<agent>] [pick] <pick> <input>`. `<input>` is the JSON of the input of the pick, and it is absent for a pick with no
|
|
282
|
+
input. The lines of the story of the run have no Instance ID.
|
|
283
|
+
|
|
284
|
+
The Harness does not print the result of a Working tool. For example, it does not print the text of a file that the
|
|
285
|
+
Agent read, or the output of a command that the Agent ran.
|
|
286
|
+
|
|
287
|
+
The Harness cuts an input that is longer than 2000 characters at its end, and marks the cut with `…`. It cuts a long
|
|
288
|
+
answer to a pick in its middle, and marks the cut with `… [<n> characters cut] …`. The model reads the full text. The
|
|
289
|
+
Harness cuts only the log.
|
|
290
|
+
|
|
291
|
+
The log of a Sandbox goes away with its pod. The Workspace deletes its Sandbox when its body gets to its final state,
|
|
292
|
+
and when a [Failure](../reference/glossary.md#failure) goes up through it. `jr2 send <run id> --event CANCEL` without
|
|
293
|
+
`--keep` also deletes it. To keep the log, save it before then:
|
|
294
|
+
|
|
295
|
+
```sh
|
|
296
|
+
kubectl -n <namespace> logs <sandbox> -c harness > <file>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
> **Caution**
|
|
300
|
+
>
|
|
301
|
+
> A person who can read the pod logs of the namespace can read each conversation, and the answers that jr2 gives to the
|
|
302
|
+
> picks. An answer can hold the output of a [`command`](../reference/authoring-surface/command.md) Effect. On a shared
|
|
303
|
+
> cluster, decide who can read the pod logs.
|
|
304
|
+
|
|
305
|
+
## Rules
|
|
306
|
+
|
|
307
|
+
- A run id prefix of fewer than 4 characters is a usage error. The command exits with `2`:
|
|
308
|
+
`jr2: run id "<prefix>" is too short (need 4+ characters)`
|
|
309
|
+
- A prefix that no run id starts with is an error. The command exits with `1`: `no run "<prefix>"`
|
|
310
|
+
- A prefix that more than one run id starts with is an error. The command lists the run ids, and exits with `1`:
|
|
311
|
+
`error: run id "<prefix>" is ambiguous`
|
|
312
|
+
- `GET /runs/:runId/events` refuses a call without the Instance token, with the status code `401`: `unauthorized`.
|
|
313
|
+
- `GET /workflows/:name/runs/:runId/events` sends only a live run of that Workflow. For a different run, it refuses with
|
|
314
|
+
the status code `404`: `no live run "<run id>" of "<workflow>"`
|
|
315
|
+
|
|
316
|
+
## Read next
|
|
317
|
+
|
|
318
|
+
- [Durable runs](../concepts/durable-runs.md)
|
|
319
|
+
- [ADR-0009](../reference/decisions/0009-cli-and-instance-interface.md): `jr2 runs`, `jr2 status`, `jr2 logs`, and run
|
|
320
|
+
id prefixes.
|
|
321
|
+
- [ADR-0014](../reference/decisions/0014-observation-is-open-run-state-is-not.md): what the Console and the feeds show
|
|
322
|
+
without the token.
|
|
323
|
+
- [ADR-0022](../reference/decisions/0022-observation-is-a-level-triggered-feed.md): the feeds.
|
|
324
|
+
- [ADR-0023](../reference/decisions/0023-the-harness-prints-the-conversation.md): the conversation in the pod log.
|
|
325
|
+
- [Architecture](../concepts/architecture.md): the Harness and the Instance Harness.
|
|
326
|
+
- [Look inside a Sandbox](look-inside-a-sandbox.md)
|