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.
Files changed (92) hide show
  1. package/README.md +286 -35
  2. package/cli-build-info.json +8 -8
  3. package/index.js +7469 -3899
  4. package/onboarding/index.json +2 -2
  5. package/onboarding/prompts/authenticate/start.md +28 -23
  6. package/onboarding/prompts/conversion/plan.md +3 -3
  7. package/onboarding/prompts/credentials/finalize-plan.md +35 -26
  8. package/onboarding/prompts/credentials/plan.md +46 -33
  9. package/onboarding/prompts/credentials/settle-credentials.md +41 -16
  10. package/onboarding/prompts/credentials/write-plan.md +104 -47
  11. package/onboarding/prompts/deployment/choose-local.md +17 -20
  12. package/onboarding/prompts/deployment/local-evaluation.md +45 -21
  13. package/onboarding/prompts/fallback/best-effort.md +11 -9
  14. package/onboarding/prompts/feature/a2ui/implement.md +4 -4
  15. package/onboarding/prompts/feature/a2ui/plan.md +3 -3
  16. package/onboarding/prompts/feature/a2ui/proof.md +5 -5
  17. package/onboarding/prompts/feature/a2ui/start.md +10 -8
  18. package/onboarding/prompts/feature/channels/implement.md +11 -8
  19. package/onboarding/prompts/feature/channels/plan.md +15 -7
  20. package/onboarding/prompts/feature/channels/proof.md +5 -5
  21. package/onboarding/prompts/feature/channels/start.md +11 -10
  22. package/onboarding/prompts/feature/chat-suggestions/implement.md +4 -4
  23. package/onboarding/prompts/feature/chat-suggestions/plan.md +3 -3
  24. package/onboarding/prompts/feature/chat-suggestions/proof.md +5 -5
  25. package/onboarding/prompts/feature/chat-suggestions/start.md +10 -8
  26. package/onboarding/prompts/feature/complete.md +2 -2
  27. package/onboarding/prompts/feature/learning/implement.md +14 -12
  28. package/onboarding/prompts/feature/learning/plan.md +4 -4
  29. package/onboarding/prompts/feature/learning/proof.md +24 -14
  30. package/onboarding/prompts/feature/learning/start.md +8 -8
  31. package/onboarding/prompts/feature/open-generative-ui/implement.md +4 -4
  32. package/onboarding/prompts/feature/open-generative-ui/plan.md +3 -3
  33. package/onboarding/prompts/feature/open-generative-ui/proof.md +5 -5
  34. package/onboarding/prompts/feature/open-generative-ui/start.md +10 -8
  35. package/onboarding/prompts/feature/realtime-sync/implement.md +7 -5
  36. package/onboarding/prompts/feature/realtime-sync/plan.md +3 -3
  37. package/onboarding/prompts/feature/realtime-sync/proof.md +5 -5
  38. package/onboarding/prompts/feature/realtime-sync/start.md +7 -7
  39. package/onboarding/prompts/feature/rich-threads/implement.md +8 -6
  40. package/onboarding/prompts/feature/rich-threads/plan.md +3 -3
  41. package/onboarding/prompts/feature/rich-threads/proof.md +5 -5
  42. package/onboarding/prompts/feature/rich-threads/start.md +7 -7
  43. package/onboarding/prompts/feature/stop.md +4 -4
  44. package/onboarding/prompts/feature/voice/implement.md +4 -4
  45. package/onboarding/prompts/feature/voice/plan.md +4 -4
  46. package/onboarding/prompts/feature/voice/proof.md +5 -5
  47. package/onboarding/prompts/feature/voice/start.md +10 -8
  48. package/onboarding/prompts/framework/ag2.md +20 -5
  49. package/onboarding/prompts/framework/agno.md +25 -9
  50. package/onboarding/prompts/framework/built-in.md +21 -6
  51. package/onboarding/prompts/framework/claude-sdk-python.md +11 -5
  52. package/onboarding/prompts/framework/claude-sdk-typescript.md +13 -6
  53. package/onboarding/prompts/framework/crewai-flows.md +24 -10
  54. package/onboarding/prompts/framework/custom-ag-ui.md +62 -28
  55. package/onboarding/prompts/framework/deep-agents.md +26 -9
  56. package/onboarding/prompts/framework/google-adk.md +18 -5
  57. package/onboarding/prompts/framework/langgraph-fastapi.md +20 -5
  58. package/onboarding/prompts/framework/langgraph-python.md +20 -5
  59. package/onboarding/prompts/framework/langgraph-typescript.md +27 -7
  60. package/onboarding/prompts/framework/llamaindex.md +24 -8
  61. package/onboarding/prompts/framework/mastra.md +21 -8
  62. package/onboarding/prompts/framework/ms-agent-dotnet.md +24 -6
  63. package/onboarding/prompts/framework/ms-agent-harness-dotnet.md +24 -5
  64. package/onboarding/prompts/framework/ms-agent-python.md +21 -5
  65. package/onboarding/prompts/framework/pydantic-ai.md +20 -5
  66. package/onboarding/prompts/framework/strands-python.md +27 -12
  67. package/onboarding/prompts/framework/strands-typescript.md +27 -12
  68. package/onboarding/prompts/frontend/angular.md +4 -4
  69. package/onboarding/prompts/frontend/nextjs.md +4 -4
  70. package/onboarding/prompts/frontend/plan.md +21 -13
  71. package/onboarding/prompts/frontend/react-native.md +3 -3
  72. package/onboarding/prompts/frontend/react-spa.md +3 -3
  73. package/onboarding/prompts/frontend/vue.md +3 -3
  74. package/onboarding/prompts/implementation/build-and-validate.md +25 -20
  75. package/onboarding/prompts/proof/complete.md +10 -7
  76. package/onboarding/prompts/proof/oss-baseline.md +6 -6
  77. package/onboarding/prompts/proof/round-trip.md +10 -10
  78. package/onboarding/prompts/research/gather.md +8 -8
  79. package/onboarding/prompts/research/merge.md +3 -3
  80. package/onboarding/prompts/research/preflight.md +2 -2
  81. package/onboarding/prompts/research/route.md +4 -4
  82. package/onboarding/prompts/setup/questions.md +193 -158
  83. package/onboarding/prompts/starter/clone.md +129 -54
  84. package/onboarding/prompts/stopped/run-failed.md +5 -3
  85. package/onboarding/prompts/subagent/create-plan.md +80 -23
  86. package/onboarding/prompts/subagent/implement-and-validate.md +33 -14
  87. package/onboarding/prompts/subagent/inspect-repository.md +3 -2
  88. package/onboarding/prompts/subagent/prove-oss-baseline.md +10 -5
  89. package/onboarding/prompts/subagent/prove-round-trip.md +23 -14
  90. package/onboarding/prompts/unsupported/no-validated-path.md +5 -4
  91. package/package.json +1 -1
  92. 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. A sign-in that ends without a session writes a `failed`
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. The note tells them to open their coding agent in the
327
- folder and paste the prompt that they copied. It also gives a line to paste
328
- that continues the same run. An agent that the CLI does not detect reads the
329
- full prompt above the note, so the note does not block it.
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 SIGTERM, the open phase and the total send `outcome: abandoned` before
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, which reads `.env.local` before `.env`, you can keep a tracked
1048
- `.env` and put the key in `.env.local` instead. Pass `--env-name .env.local` to
1049
- `project select`, or to `onboard credentials`, whose `env-file-exposed` question
1050
- offers this choice as `question.alternative`. Only `.env.local` must then be
1051
- ignored: the command adds `/.env.local` to `.gitignore` when it is not, and it
1052
- leaves `.env` as it is. The onboarding run keeps the choice, so later
1053
- `onboard credentials` and `onboard model-key` calls use `.env.local` without the
1054
- flag.
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`, `.pypirc`, `*.pem`,
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, the CLI copies them to the
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. It deletes the git ref with the folder. A run that a start
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 only, and a changed file needs `--force`. It exits 1 when the run has no backup or a
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
- Edits, new files, env files and dependency files never stop it. A file whose
1111
- content moved to a new path counts as renamed, not deleted. A new branch that
1112
- still contains the start commit does not stop it.
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 `model_quota` (no credits) or
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
- It does not send the key when a base URL such as `OPENAI_BASE_URL` points the
1604
- SDK at another endpoint, or when the shell exports a different value for the
1605
- key. It never prints the key, and it never prints the vendor's error message,
1606
- because a vendor can echo part of the key in it.
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, 12 GiB of memory available to containers, and
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
- 14 GiB or more. If the check fails, the message shows the total and available memory
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. Enforcement defaults off in every environment
1948
- until the CLI ships; development can opt in with a labeled template. Interactive commands show a
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
- `local start` also accepts this option when it performs first-time setup.
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`.
@@ -2,20 +2,20 @@
2
2
  "schemaVersion": 1,
3
3
  "package": {
4
4
  "name": "copilotkit",
5
- "version": "4.25.1"
5
+ "version": "4.27.0"
6
6
  },
7
7
  "intelligence": {
8
- "commit": "a10c17350078f78341c11e534f041224926553b1"
8
+ "commit": "85be7ded256d48363acf91081520e5492d5ec0bc"
9
9
  },
10
10
  "copilotKit": {
11
- "submittedInput": "6c428329c9b81b3aa7e92b602ab1c0a9431d36a3",
12
- "commit": "6c428329c9b81b3aa7e92b602ab1c0a9431d36a3"
11
+ "submittedInput": "3cddb360660503325b24564820c78a2ad7ee1843",
12
+ "commit": "3cddb360660503325b24564820c78a2ad7ee1843"
13
13
  },
14
14
  "channel": "production",
15
- "triggeringActor": "dustywusty",
15
+ "triggeringActor": "BenTaylorDev",
16
16
  "workflow": {
17
- "runId": "37696292513",
18
- "runUrl": "https://github.com/CopilotKit/Intelligence/actions/runs/37696292513"
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-07T22:29:19Z"
27
+ "builtAt": "2026-10-10T16:40:00Z"
28
28
  }