copilotkit 4.25.1 → 4.27.0
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 +286 -35
- package/cli-build-info.json +8 -8
- package/index.js +7469 -3899
- package/onboarding/index.json +2 -2
- package/onboarding/prompts/authenticate/start.md +28 -23
- package/onboarding/prompts/conversion/plan.md +3 -3
- package/onboarding/prompts/credentials/finalize-plan.md +35 -26
- package/onboarding/prompts/credentials/plan.md +46 -33
- package/onboarding/prompts/credentials/settle-credentials.md +41 -16
- package/onboarding/prompts/credentials/write-plan.md +104 -47
- package/onboarding/prompts/deployment/choose-local.md +17 -20
- package/onboarding/prompts/deployment/local-evaluation.md +45 -21
- package/onboarding/prompts/fallback/best-effort.md +11 -9
- package/onboarding/prompts/feature/a2ui/implement.md +4 -4
- package/onboarding/prompts/feature/a2ui/plan.md +3 -3
- package/onboarding/prompts/feature/a2ui/proof.md +5 -5
- package/onboarding/prompts/feature/a2ui/start.md +10 -8
- package/onboarding/prompts/feature/channels/implement.md +11 -8
- package/onboarding/prompts/feature/channels/plan.md +15 -7
- package/onboarding/prompts/feature/channels/proof.md +5 -5
- package/onboarding/prompts/feature/channels/start.md +11 -10
- package/onboarding/prompts/feature/chat-suggestions/implement.md +4 -4
- package/onboarding/prompts/feature/chat-suggestions/plan.md +3 -3
- package/onboarding/prompts/feature/chat-suggestions/proof.md +5 -5
- package/onboarding/prompts/feature/chat-suggestions/start.md +10 -8
- package/onboarding/prompts/feature/complete.md +2 -2
- package/onboarding/prompts/feature/learning/implement.md +14 -12
- package/onboarding/prompts/feature/learning/plan.md +4 -4
- package/onboarding/prompts/feature/learning/proof.md +24 -14
- package/onboarding/prompts/feature/learning/start.md +8 -8
- package/onboarding/prompts/feature/open-generative-ui/implement.md +4 -4
- package/onboarding/prompts/feature/open-generative-ui/plan.md +3 -3
- package/onboarding/prompts/feature/open-generative-ui/proof.md +5 -5
- package/onboarding/prompts/feature/open-generative-ui/start.md +10 -8
- package/onboarding/prompts/feature/realtime-sync/implement.md +7 -5
- package/onboarding/prompts/feature/realtime-sync/plan.md +3 -3
- package/onboarding/prompts/feature/realtime-sync/proof.md +5 -5
- package/onboarding/prompts/feature/realtime-sync/start.md +7 -7
- package/onboarding/prompts/feature/rich-threads/implement.md +8 -6
- package/onboarding/prompts/feature/rich-threads/plan.md +3 -3
- package/onboarding/prompts/feature/rich-threads/proof.md +5 -5
- package/onboarding/prompts/feature/rich-threads/start.md +7 -7
- package/onboarding/prompts/feature/stop.md +4 -4
- package/onboarding/prompts/feature/voice/implement.md +4 -4
- package/onboarding/prompts/feature/voice/plan.md +4 -4
- package/onboarding/prompts/feature/voice/proof.md +5 -5
- package/onboarding/prompts/feature/voice/start.md +10 -8
- package/onboarding/prompts/framework/ag2.md +20 -5
- package/onboarding/prompts/framework/agno.md +25 -9
- package/onboarding/prompts/framework/built-in.md +21 -6
- package/onboarding/prompts/framework/claude-sdk-python.md +11 -5
- package/onboarding/prompts/framework/claude-sdk-typescript.md +13 -6
- package/onboarding/prompts/framework/crewai-flows.md +24 -10
- package/onboarding/prompts/framework/custom-ag-ui.md +62 -28
- package/onboarding/prompts/framework/deep-agents.md +26 -9
- package/onboarding/prompts/framework/google-adk.md +18 -5
- package/onboarding/prompts/framework/langgraph-fastapi.md +20 -5
- package/onboarding/prompts/framework/langgraph-python.md +20 -5
- package/onboarding/prompts/framework/langgraph-typescript.md +27 -7
- package/onboarding/prompts/framework/llamaindex.md +24 -8
- package/onboarding/prompts/framework/mastra.md +21 -8
- package/onboarding/prompts/framework/ms-agent-dotnet.md +24 -6
- package/onboarding/prompts/framework/ms-agent-harness-dotnet.md +24 -5
- package/onboarding/prompts/framework/ms-agent-python.md +21 -5
- package/onboarding/prompts/framework/pydantic-ai.md +20 -5
- package/onboarding/prompts/framework/strands-python.md +27 -12
- package/onboarding/prompts/framework/strands-typescript.md +27 -12
- package/onboarding/prompts/frontend/angular.md +4 -4
- package/onboarding/prompts/frontend/nextjs.md +4 -4
- package/onboarding/prompts/frontend/plan.md +21 -13
- package/onboarding/prompts/frontend/react-native.md +3 -3
- package/onboarding/prompts/frontend/react-spa.md +3 -3
- package/onboarding/prompts/frontend/vue.md +3 -3
- package/onboarding/prompts/implementation/build-and-validate.md +25 -20
- package/onboarding/prompts/proof/complete.md +10 -7
- package/onboarding/prompts/proof/oss-baseline.md +6 -6
- package/onboarding/prompts/proof/round-trip.md +10 -10
- package/onboarding/prompts/research/gather.md +8 -8
- package/onboarding/prompts/research/merge.md +3 -3
- package/onboarding/prompts/research/preflight.md +2 -2
- package/onboarding/prompts/research/route.md +4 -4
- package/onboarding/prompts/setup/questions.md +193 -158
- package/onboarding/prompts/starter/clone.md +129 -54
- package/onboarding/prompts/stopped/run-failed.md +5 -3
- package/onboarding/prompts/subagent/create-plan.md +80 -23
- package/onboarding/prompts/subagent/implement-and-validate.md +33 -14
- package/onboarding/prompts/subagent/inspect-repository.md +3 -2
- package/onboarding/prompts/subagent/prove-oss-baseline.md +10 -5
- package/onboarding/prompts/subagent/prove-round-trip.md +23 -14
- package/onboarding/prompts/unsupported/no-validated-path.md +5 -4
- package/package.json +1 -1
- package/release/release-tool.js +12 -2
package/README.md
CHANGED
|
@@ -291,7 +291,10 @@ Under `--json`, the first `authentication_url` record is the URL with the code
|
|
|
291
291
|
in it, and it also carries `user_code` and `expires_at`. A renewed code writes
|
|
292
292
|
another `authentication_url` record, with `renewed: true` and its `renewal`
|
|
293
293
|
number, and another `action_required` record. The old page then shows an
|
|
294
|
-
expired code, so show the developer the new one.
|
|
294
|
+
expired code, so show the developer the new one. If an earlier `login` on this
|
|
295
|
+
machine stopped while its code was still valid, the next one reuses that code
|
|
296
|
+
instead of requesting a new one, and its `authentication_url` record carries
|
|
297
|
+
`resumed: true`. A sign-in that ends without a session writes a `failed`
|
|
295
298
|
record with `reason: expired` or `reason: access_denied`, and with
|
|
296
299
|
`retry: ask_developer`: a person must act before a new code can work. If a
|
|
297
300
|
code expired and the request for its replacement failed, for example on a rate
|
|
@@ -323,10 +326,12 @@ Run `onboard start` in the project folder, or in an empty folder for a new app.
|
|
|
323
326
|
|
|
324
327
|
`onboard start` is meant for a coding agent. If stdout is a terminal and the CLI
|
|
325
328
|
detects no coding agent, it prints the agent prompt as usual and then a short
|
|
326
|
-
note for a person.
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
329
|
+
note for a person. Most such people came from a coding agent that asked them
|
|
330
|
+
to run the command. The note sends them back to that agent, or tells them to
|
|
331
|
+
open one in the folder, with a line to paste. The line tells the agent to run
|
|
332
|
+
the command itself, because it is not interactive, and continues the same run.
|
|
333
|
+
An agent that the CLI does not detect reads the full prompt above the note, so
|
|
334
|
+
the note does not block it.
|
|
330
335
|
|
|
331
336
|
### Where a run keeps its state
|
|
332
337
|
|
|
@@ -461,7 +466,7 @@ The fields:
|
|
|
461
466
|
- `local setup` and `local update` check Docker before their progress starts. If that
|
|
462
467
|
check fails, the CLI still sends a failed setup. Its `failed_setup_phase` is
|
|
463
468
|
`docker-check`, and it carries a `failure_reason`.
|
|
464
|
-
- On Ctrl-C or
|
|
469
|
+
- On Ctrl-C, SIGTERM, or SIGHUP, the open phase and the total send `outcome: abandoned` before
|
|
465
470
|
the CLI exits. The total adds `abandoned_setup_phase` and the `bytes_downloaded` so
|
|
466
471
|
far. The CLI waits at most 2 seconds for these sends, then exits with the signal's
|
|
467
472
|
usual status.
|
|
@@ -1044,14 +1049,26 @@ line on stdout so an already-issued token is not lost, and `project select` repo
|
|
|
1044
1049
|
`api_key_provisioned: false` and exits 75. Untrack the file, then re-run. Outside a
|
|
1045
1050
|
git work tree there is nothing to protect and both write as before.
|
|
1046
1051
|
|
|
1047
|
-
For a Next.js app
|
|
1048
|
-
|
|
1049
|
-
`
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1052
|
+
For a Next.js app that hosts the CopilotKit runtime in its own route, or will,
|
|
1053
|
+
because the repository has no CopilotKit runtime yet, you can keep a tracked
|
|
1054
|
+
`.env` and put the key in `.env.local` instead: Next.js reads it before `.env`. Pass `--env-name .env.local` to `project select`, or to
|
|
1055
|
+
`onboard credentials`, whose `env-file-exposed` question offers this choice as
|
|
1056
|
+
`question.alternative`. Where the runtime is a separate server the flag is
|
|
1057
|
+
refused, because that server does not read `.env.local`. A runtime import
|
|
1058
|
+
anywhere inside the Next.js app folder counts as the app's own. The search for a
|
|
1059
|
+
separate runtime reads source files up to 12 folders below the repository root
|
|
1060
|
+
and skips `node_modules`, build output and dot folders. The command adds `.env.*` and
|
|
1061
|
+
`!.env.example` to `.gitignore` when they are missing, and leaves `.env` as it
|
|
1062
|
+
is. The onboarding run keeps the choice for that directory only, so later
|
|
1063
|
+
`onboard credentials` and `onboard model-key` calls from there use `.env.local`
|
|
1064
|
+
without the flag, and calls from any other directory use `.env`.
|
|
1065
|
+
|
|
1066
|
+
Once the project key is in a `.env.local` that git ignores and the app's runtime
|
|
1067
|
+
reads, beside a `.env` that git tracks, the CLI treats that file as your choice
|
|
1068
|
+
for the app. A new onboarding run,
|
|
1069
|
+
`license`, and `local connect` write there too, and none of them asks you to
|
|
1070
|
+
untrack `.env` again. The Channels setup commands still read and write `.env`
|
|
1071
|
+
only.
|
|
1055
1072
|
|
|
1056
1073
|
## Onboarding backups and restore
|
|
1057
1074
|
|
|
@@ -1062,23 +1079,37 @@ It prints one line on stderr that names the run whose backup it is.
|
|
|
1062
1079
|
untracked file, kept under the private ref `refs/copilotkit/backup/<run-id>`.
|
|
1063
1080
|
The CLI builds it in a temporary index, so your index, working tree, branch and
|
|
1064
1081
|
stash do not change. Env and credential files (`.env`, `.env.*`, `.dev.vars`,
|
|
1065
|
-
`.envrc`, `credentials`, `*.tfvars`, `secrets.*`, `.npmrc`,
|
|
1082
|
+
`.envrc`, `credentials`, `*.tfvars`, `*.tfstate`, `secrets.*`, `.npmrc`,
|
|
1083
|
+
`.pypirc`, `.git-credentials`, `.pgpass`, `kubeconfig`, `auth.json`, `*.pem`,
|
|
1066
1084
|
`*.key` and similar) never go into that ref, because `git push --mirror` sends
|
|
1067
|
-
it. When they are changed, untracked or ignored,
|
|
1068
|
-
backups folder, readable by you only.
|
|
1085
|
+
it. When they are changed, untracked or ignored, also inside an ignored
|
|
1086
|
+
folder, the CLI copies them to the backups folder, readable by you only.
|
|
1069
1087
|
- Outside a repository, the backup is a copy of the folder, except
|
|
1070
1088
|
`node_modules`, `dist`, `build`, `.next`, `venv`, `.venv`, `__pycache__`,
|
|
1071
1089
|
`.cache` and `.turbo`.
|
|
1072
1090
|
- A file over 20 MB, or an untracked folder with more than 5,000 files, is left
|
|
1073
1091
|
out and named in the closing report. The run still starts.
|
|
1092
|
+
- The backup cannot hold a changed submodule, a nested repository, a symlink, or
|
|
1093
|
+
a staged version of a file that the working tree no longer has. The start line
|
|
1094
|
+
counts them, and the closing report names each one with its reason. An ignored
|
|
1095
|
+
folder that takes too long to search for credential files is named the same
|
|
1096
|
+
way.
|
|
1074
1097
|
- A run that starts in a folder holding several projects takes its backup when
|
|
1075
1098
|
it moves to the one you choose with `onboard start --move`.
|
|
1099
|
+
- A backup that fails is recorded for the run. When a run has no backup, the
|
|
1100
|
+
closing report says that a restore has nothing to put back.
|
|
1101
|
+
- `onboard credentials` reports the backup as `backup.status`: `ok`, `partial`
|
|
1102
|
+
with each path it left out and why, `pending` when the backup waits for
|
|
1103
|
+
`onboard start --move`, or `failed` with the cause. A symlink to a file or
|
|
1104
|
+
folder the backup holds does not count as left out. The onboarding plan counts
|
|
1105
|
+
a `partial` or `failed` backup as a risky change and waits for your answer.
|
|
1076
1106
|
|
|
1077
1107
|
Backups live in `~/.copilotkit/backups/<run-id>/`, or in
|
|
1078
1108
|
`$COPILOTKIT_CONFIG_DIR/backups/` when that is set. Besides the current run, the
|
|
1079
1109
|
CLI keeps the newest four ended runs for up to 14 days, and the newest five runs
|
|
1080
1110
|
that have not ended for up to 90 days, because such a run can still be going on
|
|
1081
|
-
in another project.
|
|
1111
|
+
in another project. A run that has not ended is ranked by the last step it was
|
|
1112
|
+
served, so a long run is not deleted by later starts. It deletes the git ref with the folder. A run that a start
|
|
1082
1113
|
re-enters or `onboard resume` carries on counts as not ended again, and its age
|
|
1083
1114
|
counts from then.
|
|
1084
1115
|
|
|
@@ -1094,7 +1125,8 @@ copilotkit onboard restore --run <run-id> --path src/app.ts
|
|
|
1094
1125
|
A restore keeps the files the run added. It skips a file you changed after the
|
|
1095
1126
|
run ended, unless you add `--force`. A run that stopped with no closing report
|
|
1096
1127
|
has no recorded end, so the CLI cannot tell its edits from yours: a restore then
|
|
1097
|
-
puts back deleted files
|
|
1128
|
+
puts back deleted files, and files that hold only the version committed at the
|
|
1129
|
+
start, which git keeps. Any other changed file needs `--force`. It exits 1 when the run has no backup or a
|
|
1098
1130
|
`--path` is not in the backup.
|
|
1099
1131
|
|
|
1100
1132
|
### Tripwire
|
|
@@ -1103,13 +1135,34 @@ Before each step, the CLI checks the project against the backup. It stops the ru
|
|
|
1103
1135
|
and shows you what changed when:
|
|
1104
1136
|
|
|
1105
1137
|
- a file you had uncommitted changes in is deleted,
|
|
1138
|
+
- a file you had uncommitted changes in loses lines you added, in whole or in
|
|
1139
|
+
part, and nothing new takes their place: `git checkout -- .`, `git restore .`
|
|
1140
|
+
and `git checkout -p` do this, and so does a revert followed by an edit
|
|
1141
|
+
elsewhere in the file, or a file put back to its staged version,
|
|
1106
1142
|
- more than 10 files are deleted,
|
|
1107
1143
|
- HEAD no longer contains the commit the run started on, or
|
|
1108
1144
|
- a stash entry of this worktree was added or removed.
|
|
1109
1145
|
|
|
1110
|
-
|
|
1111
|
-
content moved to a new path counts as renamed, not deleted.
|
|
1112
|
-
|
|
1146
|
+
Other edits, new files, env files and dependency files never stop it. A file
|
|
1147
|
+
whose content moved to a new path counts as renamed, not deleted. One deleted
|
|
1148
|
+
committed file does not stop it either: git and the backup both hold it, and the
|
|
1149
|
+
closing report lists it with the restore command. A new branch that still
|
|
1150
|
+
contains the start commit does not stop it.
|
|
1151
|
+
|
|
1152
|
+
The revert check ignores trailing whitespace, line endings and blank lines. A
|
|
1153
|
+
formatter that strips them does not stop the run. Leading indentation counts,
|
|
1154
|
+
because it is content in Python, YAML and Makefiles. A line the run rewrites is
|
|
1155
|
+
an edit, not a revert. A line the run moves, sorts or swaps is still in the
|
|
1156
|
+
file, so it does not stop the run. Lines count by occurrence: when you wrote a
|
|
1157
|
+
line twice and the run removes one copy, the run stops. Credential files such
|
|
1158
|
+
as `.npmrc` count too. The check reads only files that changed since the
|
|
1159
|
+
start. A file over 1 MB, or a file that is not text, counts only when it holds
|
|
1160
|
+
the committed version exactly. After `copilotkit onboard tripwire --continue`,
|
|
1161
|
+
a reverted file stays accepted until its content changes. A new modification
|
|
1162
|
+
time alone does not end it.
|
|
1163
|
+
|
|
1164
|
+
A restore from the stop puts back each file as it was at the start. The run's
|
|
1165
|
+
other edits to those files are lost.
|
|
1113
1166
|
|
|
1114
1167
|
Every worktree of a repository shares one stash list, so the tripwire compares
|
|
1115
1168
|
stash entries by commit. An entry that existed at the start always counts, so
|
|
@@ -1278,6 +1331,10 @@ browser. `verify` reads the runtime's own reported license to tell the two
|
|
|
1278
1331
|
apart, and only a running runtime can answer that, so the check stays `UNKNOWN`
|
|
1279
1332
|
when the runtime is unreachable.
|
|
1280
1333
|
|
|
1334
|
+
For SSE runtimes, `--round-trip` reports an AG-UI `RUN_ERROR` message before
|
|
1335
|
+
polling for a saved answer. Intelligence JSON responses do not carry these
|
|
1336
|
+
events; inspect runtime and agent logs when that transport reports no answer.
|
|
1337
|
+
|
|
1281
1338
|
Every check reports `PASS`, `FAIL`, or `UNKNOWN`, and `UNKNOWN` never means the
|
|
1282
1339
|
check passed — an unreachable Intelligence API leaves the API key unproven
|
|
1283
1340
|
rather than condemning it. `verify` exits non-zero unless every check passed, so
|
|
@@ -1432,7 +1489,9 @@ is the project's own code and usually reads a signed-in session, which a CLI
|
|
|
1432
1489
|
request does not carry, so an auth-gated app refusing it is that app working
|
|
1433
1490
|
correctly. Pass what it reads with `--header`, repeatable. `verify` sends
|
|
1434
1491
|
the header on every request to the runtime, `/info` included, so a runtime
|
|
1435
|
-
behind auth needs no local proxy.
|
|
1492
|
+
behind auth needs no local proxy. If `/info` answers 401 or 403,
|
|
1493
|
+
`runtime_reachable` names `--header` as the fix, not `--runtime-url`. If the run
|
|
1494
|
+
already sent headers, it names the headers that the runtime refused.
|
|
1436
1495
|
|
|
1437
1496
|
### Proving a thread the app created
|
|
1438
1497
|
|
|
@@ -1566,6 +1625,13 @@ It needs no bound run. The URL must name the mount path: a bare
|
|
|
1566
1625
|
`http://localhost:3001` is refused, because `verify` would probe `/`. With no
|
|
1567
1626
|
project record, it writes nothing and exits non-zero.
|
|
1568
1627
|
|
|
1628
|
+
Inside an onboarding run, a `verify --round-trip --runtime-url <url>` that
|
|
1629
|
+
passes on a runtime other than the recorded one does not count for the run.
|
|
1630
|
+
`verify` says so on stderr, and in `roundTripNotRecorded` with `--json`, and
|
|
1631
|
+
names this command. `onboard proof` then names that runtime too. The CLI reads
|
|
1632
|
+
`localhost`, `127.0.0.1`, `0.0.0.0`, and `[::1]` on the same port and path as
|
|
1633
|
+
one runtime.
|
|
1634
|
+
|
|
1569
1635
|
### A model key has no credits or is rejected
|
|
1570
1636
|
|
|
1571
1637
|
A key with no credits passes every static check. The first model call then
|
|
@@ -1592,18 +1658,90 @@ in the environment instead. A key you export in the shell, or set with direnv or
|
|
|
1592
1658
|
the value came from: `env-file` or `environment`.
|
|
1593
1659
|
|
|
1594
1660
|
- `pass`: the vendor served a model call with the key.
|
|
1595
|
-
- `fail`: the vendor refused the key. The cause is
|
|
1596
|
-
`model_auth` (a rejected key)
|
|
1661
|
+
- `fail`: the vendor refused the key or the app's model. The cause is
|
|
1662
|
+
`model_quota` (no credits), `model_auth` (a rejected key), or
|
|
1663
|
+
`model_unavailable` (the vendor does not serve the app's model to this key).
|
|
1597
1664
|
- `missing`: neither the env file nor the environment holds a real value for
|
|
1598
1665
|
the key.
|
|
1599
1666
|
- `unsupported` or `undetermined`: the check did not settle it. A rate limit, a
|
|
1600
1667
|
vendor outage, or a probe model the key may not use proves nothing about the
|
|
1601
1668
|
key, so none of them is a `fail`.
|
|
1602
1669
|
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1670
|
+
The probe proves the key, not the app's model. When `COPILOTKIT_AGENT_MODEL` names the
|
|
1671
|
+
app's model as `provider:model` or `provider/model`, for the same vendor as the key, the
|
|
1672
|
+
command also sends a one-token call with that model. For OpenAI, that call goes through
|
|
1673
|
+
the Responses API, which the AI SDK uses. The JSON reports the model as `model`, where
|
|
1674
|
+
it was set as `modelSource`, and the env file that holds it as `modelFile`. The fix for a
|
|
1675
|
+
refused model names that file. The key and the model can live in different files, as in
|
|
1676
|
+
the Microsoft Agent Framework Python starter. A model the vendor says it does not serve is a `fail` with
|
|
1677
|
+
the cause `model_unavailable`. When the probe passed, the message names the probe model
|
|
1678
|
+
as one the same key can use. After the probe passed, a 403 or a spent quota on the app's
|
|
1679
|
+
model is `model_unavailable` too: the key works, and Google gives some models no free-tier
|
|
1680
|
+
quota. A bare 404 is `undetermined`, because a wrong base URL path answers 404 too. The command reads the variable from the shell first, then from the service whose base URL
|
|
1681
|
+
the key goes to, or else from the first service that sets it (see below). The JSON names
|
|
1682
|
+
that file as `modelFile`, and the fix for a refused model names it too.
|
|
1683
|
+
|
|
1684
|
+
A base URL on OpenAI's own hosts, including a regional one such as
|
|
1685
|
+
`eu.api.openai.com`, is still OpenAI: the command sends its usual calls to that host.
|
|
1686
|
+
|
|
1687
|
+
When `OPENAI_BASE_URL` points at an OpenAI-compatible
|
|
1688
|
+
provider, such as OpenRouter, Groq, or a local Ollama, the command asks that
|
|
1689
|
+
endpoint for its model list instead. A Python agent also reads the older
|
|
1690
|
+
`OPENAI_API_BASE`: LlamaIndex reads only that name, and LangChain's `ChatOpenAI` falls back
|
|
1691
|
+
to it. So when the key's env file belongs to a Python agent, the command counts
|
|
1692
|
+
`OPENAI_API_BASE` as the endpoint. A Python agent's env file is one whose directory, or the `agent` directory below it,
|
|
1693
|
+
holds `pyproject.toml`, `requirements.txt`, `setup.py`, `Pipfile` or `uv.lock`. A
|
|
1694
|
+
JavaScript app with `BuiltInAgent` or the AI SDK reads only `OPENAI_BASE_URL`. When only
|
|
1695
|
+
`OPENAI_API_BASE` points at another provider there, the app sends the key to OpenAI. So
|
|
1696
|
+
the command sends it nowhere and reports `undetermined` with the reason `unread-base-url`.
|
|
1697
|
+
The AI SDK adds the route after the whole base URL, so a base URL with a query string
|
|
1698
|
+
makes the app call a URL such as `…/v1?x=1/chat/completions`. The command sends nothing
|
|
1699
|
+
for it and reports `undetermined` with the reason `base-url-query`. The command reads the base URL from each service
|
|
1700
|
+
that loads env files: the app, whose directory holds the key's `.env` or `.env.local`
|
|
1701
|
+
(never the working directory), and, in `onboard credentials`, the directory of each
|
|
1702
|
+
`--copy-to` target, such as an agent service that runs from `agent/`. Each service reads
|
|
1703
|
+
its `.env.local` before its `.env`, as the app loads them, and its base URL and model go
|
|
1704
|
+
together. The key's own file counts too when it is outside the app, and so do the key
|
|
1705
|
+
file and the base URL that `onboard setup-answers` recorded: `--copy-to` copies the base
|
|
1706
|
+
URL along with the key, from the key file or else from the recorded answer. When the run
|
|
1707
|
+
chose an OpenAI-compatible provider, in `onboard classify` or the setup answers, and no
|
|
1708
|
+
base URL is found, the command sends nothing and reports `undetermined` with the reason
|
|
1709
|
+
`compatible-base-url-missing`. A key with another provider's prefix, such as `gsk_` or
|
|
1710
|
+
`sk-or-`, never goes to OpenAI either: with no base URL it is `undetermined` with the
|
|
1711
|
+
reason `key-not-openai`. So a key in `.env.local` is checked against a base URL in `.env`, and a key kept in
|
|
1712
|
+
a file outside the app is checked against the right endpoint. When the shell and the
|
|
1713
|
+
services name different base URLs (the scheme and host compare without regard to case),
|
|
1714
|
+
the command sends nothing and reports `undetermined` with the reason
|
|
1715
|
+
`endpoint-conflict`. The JSON names the vendor `openai-compatible` and the endpoint's
|
|
1716
|
+
host as `endpointHost`. With `COPILOTKIT_AGENT_MODEL` set, the command sends a
|
|
1717
|
+
one-token chat with that model to `{base}/chat/completions` instead, which gives a
|
|
1718
|
+
real `pass` or `fail`. A key that the endpoint calls invalid is a `fail`, including
|
|
1719
|
+
OpenRouter's numeric code 401. A 402 is a `fail` with the cause `model_quota`: OpenRouter
|
|
1720
|
+
answers a key with no credit that way. A 404 whose message names the app's model, as
|
|
1721
|
+
Ollama answers a model it has not pulled, is a `fail` with the cause
|
|
1722
|
+
`model_unavailable`. Any
|
|
1723
|
+
other refusal is `undetermined` with the reason `endpoint-refused-key`, because
|
|
1724
|
+
a gateway can want a header that the app adds itself. An accepted key is
|
|
1725
|
+
`undetermined` with the reason `endpoint-accepted-key`, because a model list
|
|
1726
|
+
does not prove that a model call is paid for. The command does not send the key
|
|
1727
|
+
when an Anthropic or Google base URL points the SDK at another endpoint, when
|
|
1728
|
+
only the shell sets the base URL for a key in the env file, or when the shell
|
|
1729
|
+
exports a different value for the key. It never prints the key,
|
|
1730
|
+
the base URL's path, or the vendor's error message, because a vendor can echo part of
|
|
1731
|
+
the key in it. It refuses a redirect, so the key never reaches a host that the base URL
|
|
1732
|
+
does not name. A redirect is `undetermined` with the reason `base-url-redirect`: set the
|
|
1733
|
+
base URL to the final address.
|
|
1734
|
+
|
|
1735
|
+
A local server, such as Ollama or LM Studio, needs no key. A local server is an
|
|
1736
|
+
`OPENAI_BASE_URL` in an env file on `localhost`, `127.0.0.1` or `::1`. The OpenAI SDKs
|
|
1737
|
+
still refuse an empty key, so the app needs the stand-in value `not-needed`. When the key
|
|
1738
|
+
is empty or a placeholder, it is `missing` with the reason `local-endpoint-no-key`, and
|
|
1739
|
+
nothing is sent. `onboard credentials` then tells the agent to write `not-needed` to the
|
|
1740
|
+
key's own env file. When the key is `not-needed`, the command asks the server without a
|
|
1741
|
+
key. A model list answer is `undetermined` with the reason `keyless-local-endpoint`. With
|
|
1742
|
+
`COPILOTKIT_AGENT_MODEL` set, the one-token chat gives a `pass` or a `fail`. When the
|
|
1743
|
+
server answers 401 or 403, the key is `missing` with the reason `endpoint-refused-key`.
|
|
1744
|
+
For any other base URL, `not-needed` is an ordinary key value.
|
|
1607
1745
|
|
|
1608
1746
|
During an onboarding run, a `pass` also replaces a `missing` or `fail` that the
|
|
1609
1747
|
credentials step kept for the same key in the same env file. So after the
|
|
@@ -1625,6 +1763,92 @@ binds with a key. Otherwise it asks for the project name. With `--create` or
|
|
|
1625
1763
|
`--project`, it runs `project select`, retries once when no key was written, and
|
|
1626
1764
|
checks the record and the key. Then it reads the default Learning Container.
|
|
1627
1765
|
|
|
1766
|
+
When the run recorded the developer's project answer from the setup message, the
|
|
1767
|
+
project-name question carries it as `question.recorded`, and the run uses it
|
|
1768
|
+
without asking again. `onboard setup-answers` records that answer:
|
|
1769
|
+
|
|
1770
|
+
```bash
|
|
1771
|
+
copilotkit onboard setup-answers --create billing-portal --key-file ~/keys/openai.env
|
|
1772
|
+
copilotkit onboard setup-answers
|
|
1773
|
+
```
|
|
1774
|
+
|
|
1775
|
+
It records every answer from the setup message for the bound run, so a later
|
|
1776
|
+
step reads it even after the coding agent lost its context:
|
|
1777
|
+
|
|
1778
|
+
- `--purpose <text>`, `--framework <name>`, and `--frontend <name>`.
|
|
1779
|
+
`--framework` takes a framework slug or a name from the `setup/questions`
|
|
1780
|
+
table. Another framework's name is recorded as `frameworkName`, with
|
|
1781
|
+
`framework` set to `custom-ag-ui`, the route that builds it. A name close to
|
|
1782
|
+
a table row is refused with that row named. Add `--custom-framework` to
|
|
1783
|
+
record it as given.
|
|
1784
|
+
- `--vendor <openai|anthropic|google|openai-compatible|other>`, with
|
|
1785
|
+
`--vendor-choice <developer|default|existing>`. An OpenAI-compatible provider
|
|
1786
|
+
also needs `--base-url <url>`, an http or https URL with no user, password, or
|
|
1787
|
+
key in its query or path, and `--model-id <id>`.
|
|
1788
|
+
- The project answer: `--create <name>` or `--project <slug-or-id>`.
|
|
1789
|
+
- The key-file answer: `--key-file <path>` or `--key-later`.
|
|
1790
|
+
- On the local route, the Learning model answer (`--learning later`,
|
|
1791
|
+
`--learning guided`, or `--learning-file <path>`), the connection approval
|
|
1792
|
+
(`--connection approved|declined`), and the approval to write to an env file
|
|
1793
|
+
or `.copilotkit/project.json` with uncommitted changes
|
|
1794
|
+
(`--uncommitted-writes approved|declined`).
|
|
1795
|
+
|
|
1796
|
+
A later call replaces only the answers it names. The vendor flags replace the
|
|
1797
|
+
recorded vendor answer as a whole. With no flag, it prints what the run recorded
|
|
1798
|
+
as JSON. It never reads the key from the key file or the model file, but `--key-file`
|
|
1799
|
+
must name an existing file. When the key file sets `OPENAI_BASE_URL`, the JSON shows it as
|
|
1800
|
+
`keyFileBaseUrl`, and `--vendor openai-compatible` takes it in place of `--base-url`. Any other value is refused, and the message does not repeat it.
|
|
1801
|
+
A free-text answer shaped like a key, such as an `sk-`, `gsk_`, or `AIza` key or
|
|
1802
|
+
a long random token, is refused the same way.
|
|
1803
|
+
|
|
1804
|
+
Only the developer accepts the local evaluation agreement, in their own
|
|
1805
|
+
terminal, with `copilotkit local accept-terms`. The command refuses to run
|
|
1806
|
+
without a terminal or when a coding agent runs it. It shows the agreement, its
|
|
1807
|
+
version, the organization, and the signed-in email, and stores the acceptance in
|
|
1808
|
+
`local/eula-acceptance.json` in the CLI configuration directory (mode 600).
|
|
1809
|
+
New local setup and `init --local` use a stored acceptance while it matches the
|
|
1810
|
+
current agreement, organization, and user. Renewal asks every time: under a
|
|
1811
|
+
coding agent, the developer runs `local renew` in their own terminal. A coding
|
|
1812
|
+
agent cannot pass `--accept-eula-version`; scripts still can.
|
|
1813
|
+
|
|
1814
|
+
`onboard local-terms --json` reads the agreement and prints its URL, version,
|
|
1815
|
+
organization, and `accepted`. It creates nothing and requests no license. On the
|
|
1816
|
+
local route, the setup message says the developer accepts the agreement in their
|
|
1817
|
+
own terminal, and `starter/clone` and `deployment/local-evaluation` stop before
|
|
1818
|
+
the install until `accepted` is true.
|
|
1819
|
+
|
|
1820
|
+
When `init --local --install` stops after it cloned the starter, it still
|
|
1821
|
+
installs the starter's dependencies, and its error says so or names the install
|
|
1822
|
+
command.
|
|
1823
|
+
|
|
1824
|
+
#### Model vendors in this release
|
|
1825
|
+
|
|
1826
|
+
Onboarding offers a new agent only the vendors in this table. When onboarding
|
|
1827
|
+
chooses the vendor for a new agent, `onboard setup-answers` refuses another
|
|
1828
|
+
vendor for the framework, and `onboard credentials` and `onboard model-key`
|
|
1829
|
+
refuse another vendor's key before they read or send it. The message names the
|
|
1830
|
+
vendors the framework takes, and never a key value. Each refusal sends the
|
|
1831
|
+
`cli.onboarding.vendor_held_back` event with the framework and the vendor.
|
|
1832
|
+
|
|
1833
|
+
An existing agent keeps its own vendor and model. A vendor recorded with
|
|
1834
|
+
`--vendor-choice existing`, or a run that `onboard classify` placed on an
|
|
1835
|
+
existing agent, is never refused.
|
|
1836
|
+
|
|
1837
|
+
| Framework | Vendors |
|
|
1838
|
+
| -------------------------------------- | -------------------------------------------- |
|
|
1839
|
+
| Built-in CopilotKit agent | OpenAI, OpenAI-compatible, Anthropic, Google |
|
|
1840
|
+
| ADK | Google, OpenAI, OpenAI-compatible |
|
|
1841
|
+
| Claude Agent SDK (Python, TypeScript) | Anthropic |
|
|
1842
|
+
| Every other framework and Custom agent | OpenAI, OpenAI-compatible |
|
|
1843
|
+
|
|
1844
|
+
Anthropic and Google come to the other frameworks in a later release. Their
|
|
1845
|
+
CopilotKit middleware sends the page context as a second system message, after
|
|
1846
|
+
the user message. Anthropic and Google refuse that message order, so every chat
|
|
1847
|
+
fails. The built-in agent sends the context in one leading system message, and
|
|
1848
|
+
ADK puts it in its one system instruction. To use Anthropic or Google for a new
|
|
1849
|
+
agent now, choose the built-in CopilotKit agent. An existing agent on Anthropic
|
|
1850
|
+
or Google can see page context fail until a CopilotKit SDK release fixes it.
|
|
1851
|
+
|
|
1628
1852
|
Read `status`:
|
|
1629
1853
|
|
|
1630
1854
|
- `ready`: the project, key, and container are settled.
|
|
@@ -1733,6 +1957,26 @@ explicitly re-enabled. `copilotkit telemetry reset` restores the full
|
|
|
1733
1957
|
fresh-install state: the decision is forgotten and the one-time notice shows
|
|
1734
1958
|
again on the next interactive run.
|
|
1735
1959
|
|
|
1960
|
+
Every event carries `invocation_via`, which tells where the call came from. The
|
|
1961
|
+
CopilotKit skills append a hidden `--via` flag to each command they give, for
|
|
1962
|
+
example `--via skill:copilotkit-cli`. The CLI removes the flag before the
|
|
1963
|
+
command reads its arguments, so the flag never changes what the command does.
|
|
1964
|
+
The values are:
|
|
1965
|
+
|
|
1966
|
+
- `skill:copilotkit`, `skill:copilotkit-cli` or `skill:copilotkit-channels`:
|
|
1967
|
+
the caller passed that tag.
|
|
1968
|
+
- `other`: the caller passed `--via` with a value that is not on that list. The
|
|
1969
|
+
command still runs.
|
|
1970
|
+
- `onboarding`: an untagged call inside an onboarding run, or any `onboard`
|
|
1971
|
+
command. A tag wins over a run, because `onboarding_run_id` already records
|
|
1972
|
+
the run.
|
|
1973
|
+
- `direct`: any other call.
|
|
1974
|
+
|
|
1975
|
+
`cli.command.invoked` also carries `detected_coding_agent` and
|
|
1976
|
+
`detected_coding_agent_source`, read the same way as for onboarding. The CLI
|
|
1977
|
+
reads them once for each command. On Windows it does not read the parent
|
|
1978
|
+
processes for this event, because the PowerShell call can take three seconds.
|
|
1979
|
+
|
|
1736
1980
|
## Preview and release builds
|
|
1737
1981
|
|
|
1738
1982
|
Tester-facing prerelease builds are produced by CI via `workflow_dispatch` on
|
|
@@ -1912,6 +2156,10 @@ when the flag is off. A candidate file overrides release selection. The CLI down
|
|
|
1912
2156
|
its private Helm tool, checks chart support, and pins the chart checksum and runtime
|
|
1913
2157
|
image digests. Saved stacks resume with their saved release.
|
|
1914
2158
|
|
|
2159
|
+
The private chart overlay gives app-api the browser realtime address
|
|
2160
|
+
`ws://localhost:<selected-gateway-port>/client`. Trajectory live views use this
|
|
2161
|
+
address, including when setup selects a different port for a second local stack.
|
|
2162
|
+
|
|
1915
2163
|
The September 28 check found that release 0.13.8 lacks the local evaluation profile.
|
|
1916
2164
|
Automatic setup reports `release_unavailable` before license issuance or cluster creation for this release.
|
|
1917
2165
|
This is a release packaging blocker, not a request for user configuration.
|
|
@@ -1927,10 +2175,10 @@ or prove fresh-install acceptance.
|
|
|
1927
2175
|
Use `--candidate /path/to/candidate.json` only to override release selection during
|
|
1928
2176
|
development or release testing. Full fresh-install acceptance remains incomplete.
|
|
1929
2177
|
|
|
1930
|
-
Use Docker with at least 4 CPUs,
|
|
2178
|
+
Use Docker with at least 4 CPUs, 4 GiB of memory available to containers, and
|
|
1931
2179
|
40 GiB free storage for each stack. The CLI measures Docker resources after existing
|
|
1932
2180
|
workloads. Docker keeps part of its memory limit for itself, so set the limit to
|
|
1933
|
-
|
|
2181
|
+
6 GiB or more. If the check fails, the message shows the total and available memory
|
|
1934
2182
|
and how much to add.
|
|
1935
2183
|
The CLI downloads private, checksum-verified Helm and k3d tools.
|
|
1936
2184
|
|
|
@@ -1944,15 +2192,18 @@ JSON and non-interactive setup require a prior `copilotkit login`.
|
|
|
1944
2192
|
Local setup obtains the license after sign-in. The license belongs to the selected
|
|
1945
2193
|
organization; Ops records the signed-in person who requests it.
|
|
1946
2194
|
The [local evaluation EULA flow](../../docs/licensing/local-evaluation-eula-cli.md)
|
|
1947
|
-
adds acceptance before new setup and renewal licenses.
|
|
1948
|
-
|
|
2195
|
+
adds acceptance before new setup and renewal licenses. Hosted dev, staging, and production
|
|
2196
|
+
require acceptance; use CLI 4.25.1 or newer. Interactive commands show a
|
|
1949
2197
|
short developer-license summary, version, organization, and user, then open the full EULA in the
|
|
1950
2198
|
browser. Review it, type `accept` exactly, and press Enter. The link stays visible for manual review
|
|
1951
2199
|
if the browser cannot open. Opening the page does not accept; there is no scroll requirement.
|
|
1952
2200
|
Esc/Ctrl-C/Ctrl-D cancels. The published agreement is usable once Ops enforcement is enabled.
|
|
1953
2201
|
Template acceptance uses the normal license request and audit write, marked `status: template`.
|
|
1954
|
-
Scripts must supply `--accept-eula-version <version>` to `local setup` or `local renew
|
|
1955
|
-
|
|
2202
|
+
Scripts must supply `--accept-eula-version <version>` to `local setup` or `local renew`,
|
|
2203
|
+
or, for setup, use an acceptance stored by `copilotkit local accept-terms`. `local start` also accepts
|
|
2204
|
+
this option when it performs first-time setup. When a coding agent runs the command, the
|
|
2205
|
+
option is refused and no license is requested: the developer runs `local accept-terms` in
|
|
2206
|
+
their own terminal.
|
|
1956
2207
|
Generic confirmation does not accept terms. Declining requests no license and preserves saved data.
|
|
1957
2208
|
|
|
1958
2209
|
Local `init` (including `--existing`) uses the same EULA review as `local setup`.
|
package/cli-build-info.json
CHANGED
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"package": {
|
|
4
4
|
"name": "copilotkit",
|
|
5
|
-
"version": "4.
|
|
5
|
+
"version": "4.27.0"
|
|
6
6
|
},
|
|
7
7
|
"intelligence": {
|
|
8
|
-
"commit": "
|
|
8
|
+
"commit": "85be7ded256d48363acf91081520e5492d5ec0bc"
|
|
9
9
|
},
|
|
10
10
|
"copilotKit": {
|
|
11
|
-
"submittedInput": "
|
|
12
|
-
"commit": "
|
|
11
|
+
"submittedInput": "3cddb360660503325b24564820c78a2ad7ee1843",
|
|
12
|
+
"commit": "3cddb360660503325b24564820c78a2ad7ee1843"
|
|
13
13
|
},
|
|
14
14
|
"channel": "production",
|
|
15
|
-
"triggeringActor": "
|
|
15
|
+
"triggeringActor": "BenTaylorDev",
|
|
16
16
|
"workflow": {
|
|
17
|
-
"runId": "
|
|
18
|
-
"runUrl": "https://github.com/CopilotKit/Intelligence/actions/runs/
|
|
17
|
+
"runId": "38068472728",
|
|
18
|
+
"runUrl": "https://github.com/CopilotKit/Intelligence/actions/runs/38068472728"
|
|
19
19
|
},
|
|
20
20
|
"validationResult": "passed",
|
|
21
21
|
"ag2": {
|
|
@@ -24,5 +24,5 @@
|
|
|
24
24
|
"revision": "main",
|
|
25
25
|
"pinned": false
|
|
26
26
|
},
|
|
27
|
-
"builtAt": "2026-10-
|
|
27
|
+
"builtAt": "2026-10-10T16:40:00Z"
|
|
28
28
|
}
|