koneck 2.25.66 → 2.25.68
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/dist/context-limit.d.ts +28 -0
- package/dist/context-limit.d.ts.map +1 -1
- package/dist/context-limit.js +43 -0
- package/dist/context-limit.js.map +1 -1
- package/dist/engine.d.ts +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +77 -25
- package/dist/engine.js.map +1 -1
- package/dist/glyphs.d.ts +7 -1
- package/dist/glyphs.d.ts.map +1 -1
- package/dist/glyphs.js +6 -1
- package/dist/glyphs.js.map +1 -1
- package/dist/ink-chat.d.ts.map +1 -1
- package/dist/ink-chat.js +17 -6
- package/dist/ink-chat.js.map +1 -1
- package/dist/providers.d.ts +22 -0
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +12 -1
- package/dist/providers.js.map +1 -1
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/context-limit.d.ts
CHANGED
|
@@ -76,4 +76,32 @@ export declare const OLLAMA_DEFAULT_CONTEXT = 4096;
|
|
|
76
76
|
export declare function ollamaServingLimit(env?: NodeJS.ProcessEnv): number;
|
|
77
77
|
/** Whether a prompt of this size leaves usable room in the window. */
|
|
78
78
|
export declare function windowIsTooSmall(promptTokens: number, limit: number): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* What every request costs before the user has typed anything.
|
|
81
|
+
*
|
|
82
|
+
* Measured rather than assumed, because the number turned out to matter more than anything else
|
|
83
|
+
* about running a local model: the system prompt is about 1.5k tokens and the tool schemas about
|
|
84
|
+
* 2.3k, so a request starts at roughly 3.8k. Against Ollama's default 4,096 that leaves a few
|
|
85
|
+
* hundred tokens for the conversation, the reply and every tool result — which is exactly what a
|
|
86
|
+
* model looping, emitting tool calls as prose, and inventing its own origin looks like from
|
|
87
|
+
* outside.
|
|
88
|
+
*
|
|
89
|
+
* Characters over 3.6 is a rough conversion and deliberately not presented as exact. It only has
|
|
90
|
+
* to be right enough to tell a comfortable fit from a hopeless one.
|
|
91
|
+
*/
|
|
92
|
+
export declare function fixedRequestTokens(systemPrompt: string, toolSchemas: string): number;
|
|
93
|
+
/** Whether the fixed cost leaves so little room that the session cannot work. */
|
|
94
|
+
export declare function overheadIsCrowded(fixedTokens: number, limit: number): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* What to tell somebody whose window cannot hold the prompt.
|
|
97
|
+
*
|
|
98
|
+
* `remote` matters and was wrong in the advice given before this: OLLAMA_CONTEXT_LENGTH is read by
|
|
99
|
+
* the Ollama server, so for an endpoint on another machine it has to be set on that machine. Told
|
|
100
|
+
* to set it locally, someone would restart the wrong Ollama and see no change.
|
|
101
|
+
*/
|
|
102
|
+
export declare function crowdedWindowAdvice(fixedTokens: number, limit: number, opts: {
|
|
103
|
+
model: string;
|
|
104
|
+
endpoint: string;
|
|
105
|
+
remote: boolean;
|
|
106
|
+
}): string;
|
|
79
107
|
//# sourceMappingURL=context-limit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-limit.d.ts","sourceRoot":"","sources":["../src/context-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA6BH;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C,uCAAuC;AACvC,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAS1E;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,OAAO,CAAC;AAE/B,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED,uFAAuF;AACvF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAI9D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAgB7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,EACb,SAAS,SAAQ,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBxB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,OAAQ,CAAC;AAE5C;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAK/E;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAG7E"}
|
|
1
|
+
{"version":3,"file":"context-limit.d.ts","sourceRoot":"","sources":["../src/context-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA6BH;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C,uCAAuC;AACvC,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAS1E;AAED;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,OAAO,CAAC;AAE/B,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED,uFAAuF;AACvF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAI9D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAgB7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,EACb,SAAS,SAAQ,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBxB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,OAAQ,CAAC;AAE5C;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAK/E;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAG7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAI7E;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACzD,MAAM,CAaR"}
|
package/dist/context-limit.js
CHANGED
|
@@ -170,4 +170,47 @@ export function windowIsTooSmall(promptTokens, limit) {
|
|
|
170
170
|
// Under a third left for the reply and the next turn's tool results is not room to work in.
|
|
171
171
|
return promptTokens > 0 && promptTokens > limit * 0.66;
|
|
172
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* What every request costs before the user has typed anything.
|
|
175
|
+
*
|
|
176
|
+
* Measured rather than assumed, because the number turned out to matter more than anything else
|
|
177
|
+
* about running a local model: the system prompt is about 1.5k tokens and the tool schemas about
|
|
178
|
+
* 2.3k, so a request starts at roughly 3.8k. Against Ollama's default 4,096 that leaves a few
|
|
179
|
+
* hundred tokens for the conversation, the reply and every tool result — which is exactly what a
|
|
180
|
+
* model looping, emitting tool calls as prose, and inventing its own origin looks like from
|
|
181
|
+
* outside.
|
|
182
|
+
*
|
|
183
|
+
* Characters over 3.6 is a rough conversion and deliberately not presented as exact. It only has
|
|
184
|
+
* to be right enough to tell a comfortable fit from a hopeless one.
|
|
185
|
+
*/
|
|
186
|
+
export function fixedRequestTokens(systemPrompt, toolSchemas) {
|
|
187
|
+
return Math.round((systemPrompt.length + toolSchemas.length) / 3.6);
|
|
188
|
+
}
|
|
189
|
+
/** Whether the fixed cost leaves so little room that the session cannot work. */
|
|
190
|
+
export function overheadIsCrowded(fixedTokens, limit) {
|
|
191
|
+
// Half the window spent before the conversation starts is the point at which compaction cannot
|
|
192
|
+
// save it either: there is nothing left to compact into.
|
|
193
|
+
return limit > 0 && fixedTokens > limit * 0.5;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* What to tell somebody whose window cannot hold the prompt.
|
|
197
|
+
*
|
|
198
|
+
* `remote` matters and was wrong in the advice given before this: OLLAMA_CONTEXT_LENGTH is read by
|
|
199
|
+
* the Ollama server, so for an endpoint on another machine it has to be set on that machine. Told
|
|
200
|
+
* to set it locally, someone would restart the wrong Ollama and see no change.
|
|
201
|
+
*/
|
|
202
|
+
export function crowdedWindowAdvice(fixedTokens, limit, opts) {
|
|
203
|
+
const k = (n) => `${(n / 1000).toFixed(1)}k`;
|
|
204
|
+
const where = opts.remote
|
|
205
|
+
? `on the machine serving ${opts.endpoint} (not this one), and restart Ollama there`
|
|
206
|
+
: 'here, and restart Ollama';
|
|
207
|
+
return `**${opts.model} has about ${k(limit)} tokens to work in, and ${k(fixedTokens)} of that ` +
|
|
208
|
+
`is spent before you type anything** (the instructions and the tool descriptions).\n\n` +
|
|
209
|
+
`That leaves roughly ${k(Math.max(0, limit - fixedTokens))} for your question, the reply, and ` +
|
|
210
|
+
`every file the agent reads. It is why a model this size starts repeating itself, writes tool ` +
|
|
211
|
+
`calls as plain text, or invents an answer about itself: it is not being given room to see ` +
|
|
212
|
+
`what it was told.\n\n` +
|
|
213
|
+
`Fix it where Ollama runs: set \`OLLAMA_CONTEXT_LENGTH=32768\` ${where}. ` +
|
|
214
|
+
`Then \`/context\` to confirm it took.`;
|
|
215
|
+
}
|
|
173
216
|
//# sourceMappingURL=context-limit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-limit.js","sourceRoot":"","sources":["../src/context-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,wEAAwE;AACxE,MAAM,YAAY,GAA6C;IAC7D,CAAC,eAAe,EAAE,MAAM,CAAC;IACzB,CAAC,aAAa,EAAE,MAAM,CAAC;IACvB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,aAAa,EAAE,MAAM,CAAC;IACvB,CAAC,UAAU,EAAE,MAAM,CAAC;IACpB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACjB,CAAC,OAAO,EAAE,KAAK,CAAC;IAChB,CAAC,WAAW,EAAE,MAAM,CAAC;IACrB,CAAC,QAAQ,EAAE,KAAK,CAAC;IACjB,CAAC,SAAS,EAAE,MAAM,CAAC;IACnB,CAAC,KAAK,EAAE,MAAM,CAAC;IACf,CAAC,QAAQ,EAAE,OAAO,CAAC;IACnB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,IAAI,EAAE,OAAO,CAAC;IACf,CAAC,IAAI,EAAE,OAAO,CAAC;IACf,CAAC,iBAAiB,EAAE,OAAO,CAAC;IAC5B,CAAC,iBAAiB,EAAE,OAAO,CAAC;IAC5B,CAAC,cAAc,EAAE,OAAO,CAAC;IACzB,CAAC,aAAa,EAAE,OAAO,CAAC;IACxB,CAAC,QAAQ,EAAE,OAAO,CAAC;IACnB,CAAC,QAAQ,EAAE,SAAS,CAAC;IACrB,CAAC,MAAM,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,uCAAuC;AACvC,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,UAAmB;IAChE,IAAI,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACjC,IAAI,IAAI,GAA+C,IAAI,CAAC;IAC5D,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,SAAS;QACvC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,EAAE,KAAK,IAAI,qBAAqB,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC;AAE/B,MAAM,UAAU,aAAa,CAAC,YAAoB,EAAE,KAAa;IAC/D,OAAO,YAAY,GAAG,CAAC,IAAI,YAAY,IAAI,KAAK,GAAG,UAAU,CAAC;AAChE,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,MAAM,IAAI,GAAG,MAAM,CAAE,GAA4B,EAAE,OAAO,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACvF,OAAO,4HAA4H;SAChI,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAE,GAA4B,EAAE,OAAO,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG;QACf,wCAAwC;QACxC,gCAAgC;QAChC,yCAAyC;QACzC,4CAA4C;KAC7C,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACjD,mFAAmF;QACnF,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAe,EACf,MAA0B,EAC1B,KAAa,EACb,SAAS,GAAG,KAAK;IAEjB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,EAAE;YACnE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;YAC5D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA+C,CAAC;QAChF,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,4FAA4F;QAC5F,iCAAiC;QACjC,KAAK,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,EAAE,CAAC;YACjG,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAG,qDAAqD;IACtE,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,KAAK;QACvD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;QACxB,CAAC,CAAC,sBAAsB,CAAC;AAC7B,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,YAAoB,EAAE,KAAa;IAClE,4FAA4F;IAC5F,OAAO,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,KAAK,GAAG,IAAI,CAAC;AACzD,CAAC"}
|
|
1
|
+
{"version":3,"file":"context-limit.js","sourceRoot":"","sources":["../src/context-limit.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts
CHANGED
|
@@ -185,7 +185,7 @@ export declare function toolDetailFor(name: string, argsJson: string): string;
|
|
|
185
185
|
* before a conversation starts, so on the default there is almost no room to work in, and the
|
|
186
186
|
* symptom is exactly this: nothing comes back.
|
|
187
187
|
*/
|
|
188
|
-
export declare function emptyResponseAdvice(provider: string, model: string, count: number, toolsWorked: boolean): string;
|
|
188
|
+
export declare function emptyResponseAdvice(provider: string, model: string, count: number, toolsWorked: boolean, endpoint?: string): string;
|
|
189
189
|
export declare function runReActLoop(messages: Message[], client: OpenAI, config: AgentConfig, effectiveCwd: string, stats: TokenStats, mcpClients: MCPClientEntry[], plugins: PluginEntry[], openaiTools: OpenAI.Chat.ChatCompletionTool[], turnOffset?: number, abortSignal?: AbortSignal, checkpoint?: CheckpointRecorder,
|
|
190
190
|
/**
|
|
191
191
|
* The plan, held by the session rather than by this loop.
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.js
CHANGED
|
@@ -7,9 +7,9 @@ import { execa } from 'execa';
|
|
|
7
7
|
import { TOOL_DEFINITIONS, dispatchTool, describeShell, unknownToolError, resolveToolAlias, aliasNotice, isToolFailure, } from './tools.js';
|
|
8
8
|
import { tui } from './tui.js';
|
|
9
9
|
import { isGitRepo, createWorktree, mergeWorktree } from './worktree.js';
|
|
10
|
-
import { resolveProvider, getApiKey } from './providers.js';
|
|
10
|
+
import { resolveProvider, getApiKey, servesLocally, isPrivateHost } from './providers.js';
|
|
11
11
|
import { compressIfNeeded } from './compressor.js';
|
|
12
|
-
import { contextLimitFor, looksLikeContextOverflow, parseContextLimit, fetchModelContextLimit, ollamaServingLimit,
|
|
12
|
+
import { contextLimitFor, looksLikeContextOverflow, parseContextLimit, fetchModelContextLimit, ollamaServingLimit, fixedRequestTokens, overheadIsCrowded, crowdedWindowAdvice, } from './context-limit.js';
|
|
13
13
|
import { generateSessionId, saveSession } from './session.js';
|
|
14
14
|
import { EMPTY_PLAN, parsePlan, planReminder, planAck, noPlanReminder } from './plan.js';
|
|
15
15
|
import { spillIfOversized } from './spill.js';
|
|
@@ -392,8 +392,26 @@ export function truncateMemory(memory, limit = MAX_MEMORY_CHARS) {
|
|
|
392
392
|
}
|
|
393
393
|
function buildSystemPrompt(ctx, memory = null, project = null, agentInstructions = null) {
|
|
394
394
|
// ── Core identity & non-negotiable rules ────────────────────────────────────
|
|
395
|
+
//
|
|
396
|
+
// The identity comes first, and says what it is not.
|
|
397
|
+
//
|
|
398
|
+
// Asked "who are you?", qwen3-coder answered "an AI assistant created by Anthropic". Nothing in
|
|
399
|
+
// KONECK ever said that — the line naming its real author sat at the end of the prompt, 93% of
|
|
400
|
+
// the way in, and was the first thing lost when a small serving window truncated it. What the
|
|
401
|
+
// model reached for instead is its training: the coder models are distilled in part from
|
|
402
|
+
// Claude's output, so Anthropic is the answer they confabulate when nothing else is in front of
|
|
403
|
+
// them. An explicit denial is worth the tokens because a plausible false attribution is worse
|
|
404
|
+
// than no answer, and because the true answer is short.
|
|
395
405
|
const rules = `You are KONECK, a production-grade autonomous coding agent.
|
|
396
406
|
|
|
407
|
+
WHO YOU ARE — fact, not inference:
|
|
408
|
+
KONECK is Kona Dludlu's open-source coding agent, written in Eswatini.
|
|
409
|
+
https://github.com/Gubevu/konech
|
|
410
|
+
You are running on the model \`${ctx.model ?? 'unnamed'}\` served by \`${ctx.provider ?? 'unknown'}\`.
|
|
411
|
+
KONECK is the program; the model is a part it uses. You were NOT made by Anthropic, OpenAI,
|
|
412
|
+
Google, Alibaba or DeepSeek — the model's maker is not yours, and you must not claim to be the
|
|
413
|
+
model. If asked something about yourself you do not know, say so rather than inventing it.
|
|
414
|
+
|
|
397
415
|
CRITICAL BEHAVIOUR — read these first and never break them:
|
|
398
416
|
- DO NOT introduce yourself or mention your name, creator, or purpose UNLESS the user explicitly asks "who are you" or "who made you". Just answer the task.
|
|
399
417
|
- CHOOSE THE RIGHT SHAPE FOR THE ANSWER. The UI renders markdown, so pick the form that carries the information best:
|
|
@@ -424,9 +442,7 @@ CRITICAL BEHAVIOUR — read these first and never break them:
|
|
|
424
442
|
10. A direct instruction is an instruction to act, not to survey. "Run the system" means find how it starts — package.json scripts, a README, a Makefile — install what is missing, and start it. Reading every file first is not preparation, it is delay.
|
|
425
443
|
11. A blocker is part of the work. A missing dependency gets installed; a command that does not exist gets replaced with the one that does; a failure gets read and worked around. Stop and ask only when you have genuinely run out of ways through, and say what you tried.
|
|
426
444
|
12. The tool list you were given is complete and exact. If a call comes back saying a tool does not exist, use one of the names you were given rather than guessing another.
|
|
427
|
-
|
|
428
|
-
## About you (only share when asked)
|
|
429
|
-
You are KONECK — created by Kona Dludlu from Eswatini as an open-source AI research project exploring agentic coding. Repo: https://github.com/Gubevu/konech`;
|
|
445
|
+
`;
|
|
430
446
|
// ── Project context ──────────────────────────────────────────────────────────
|
|
431
447
|
const projectSection = project
|
|
432
448
|
? '\n## Project\n' + projectSummary(project)
|
|
@@ -739,18 +755,30 @@ export function toolDetailFor(name, argsJson) {
|
|
|
739
755
|
* before a conversation starts, so on the default there is almost no room to work in, and the
|
|
740
756
|
* symptom is exactly this: nothing comes back.
|
|
741
757
|
*/
|
|
742
|
-
export function emptyResponseAdvice(provider, model, count, toolsWorked) {
|
|
743
|
-
|
|
758
|
+
export function emptyResponseAdvice(provider, model, count, toolsWorked, endpoint) {
|
|
759
|
+
// The endpoint is named, not just the provider slot. Reported as "omni returned 3 empty
|
|
760
|
+
// responses ... yet i am using ollama" — both true at once, because the endpoint saved under the
|
|
761
|
+
// omni slot is an Ollama box. Naming the address answers the objection in the message itself.
|
|
762
|
+
const who = endpoint ? `${provider} at ${endpoint}` : provider;
|
|
763
|
+
const observed = `${who} returned ${count} empty responses in a row for "${model}" — ` +
|
|
744
764
|
`no text and no tool calls` +
|
|
745
765
|
(toolsWorked ? ', although tool calls from this model worked earlier in the session.' : '.');
|
|
746
|
-
|
|
766
|
+
// Decided from the address rather than from the provider's name, which is the third time that
|
|
767
|
+
// distinction has mattered: a LAN Ollama reached through a slot called "omni" was getting
|
|
768
|
+
// "try another model" instead of the one explanation that fits.
|
|
769
|
+
const local = endpoint
|
|
770
|
+
? servesLocally(provider, endpoint)
|
|
771
|
+
: provider.toLowerCase() === 'ollama';
|
|
772
|
+
if (local) {
|
|
747
773
|
return observed + '\n' +
|
|
748
|
-
'The likeliest cause is
|
|
749
|
-
'
|
|
750
|
-
'
|
|
751
|
-
'conversation is counted
|
|
752
|
-
'
|
|
753
|
-
|
|
774
|
+
'The likeliest cause is the context window rather than the model. Ollama serves a default ' +
|
|
775
|
+
'of 4,096 tokens whatever the model was trained for, and silently truncates a longer ' +
|
|
776
|
+
'prompt instead of refusing it — and KONECK\'s instructions and tool descriptions come to ' +
|
|
777
|
+
'about 3.8k of that before your conversation is counted, which is exactly how a turn comes ' +
|
|
778
|
+
'back with nothing in it. Set OLLAMA_CONTEXT_LENGTH=32768 where Ollama runs' +
|
|
779
|
+
(endpoint ? ` — the machine serving ${endpoint}` : '') +
|
|
780
|
+
', or use a Modelfile with PARAMETER num_ctx 32768, and restart it. If you know the real ' +
|
|
781
|
+
'limit, `/config contextTokens <n>` makes KONECK compact before reaching it.';
|
|
754
782
|
}
|
|
755
783
|
return observed + '\nIf it keeps happening, try another model with /models.';
|
|
756
784
|
}
|
|
@@ -831,6 +859,31 @@ detectedContext = { current: 0 }) {
|
|
|
831
859
|
let textToolsNoticed = false;
|
|
832
860
|
/** Said once: a model that writes calls as shell commands will keep doing it. */
|
|
833
861
|
let commandStyleNoticed = false;
|
|
862
|
+
// What every request costs before the user has typed anything — the instructions plus the tool
|
|
863
|
+
// descriptions. Worth knowing once, because on a small window it is the whole story: measured at
|
|
864
|
+
// about 3.8k tokens against Ollama's default 4,096, which leaves a few hundred for the
|
|
865
|
+
// conversation, the reply, and every file read. A model given that little room loops, writes
|
|
866
|
+
// tool calls as prose, and answers questions about itself from its training. All three were
|
|
867
|
+
// reported as separate faults.
|
|
868
|
+
{
|
|
869
|
+
const systemText = messages.find(m => m.role === 'system')?.content;
|
|
870
|
+
const fixed = fixedRequestTokens(typeof systemText === 'string' ? systemText : '', JSON.stringify(openaiTools));
|
|
871
|
+
if (overheadIsCrowded(fixed, effectiveLimit())) {
|
|
872
|
+
const advice = crowdedWindowAdvice(fixed, effectiveLimit(), {
|
|
873
|
+
model: config.model,
|
|
874
|
+
endpoint: resolveProvider(config.provider, config.baseURL).baseURL,
|
|
875
|
+
// OLLAMA_CONTEXT_LENGTH is read by the server, so for an endpoint on another machine it
|
|
876
|
+
// has to be set there. The advice said "in Ollama's environment", which for a remote box
|
|
877
|
+
// sends someone to restart the wrong one.
|
|
878
|
+
remote: !isPrivateHost(resolveProvider(config.provider, config.baseURL).baseURL)
|
|
879
|
+
? false
|
|
880
|
+
: !/localhost|127\.0\.0\.1|::1/.test(resolveProvider(config.provider, config.baseURL).baseURL),
|
|
881
|
+
});
|
|
882
|
+
config.onCrowdedWindow?.(fixed, effectiveLimit(), advice);
|
|
883
|
+
if (!silent)
|
|
884
|
+
tui.printWarning(advice);
|
|
885
|
+
}
|
|
886
|
+
}
|
|
834
887
|
const turnBudget = resolveMaxTurns(config.maxTurns);
|
|
835
888
|
for (let turn = 0; turnBudget === null || turn < turnBudget; turn++) {
|
|
836
889
|
if (abortSignal?.aborted)
|
|
@@ -1302,7 +1355,7 @@ detectedContext = { current: 0 }) {
|
|
|
1302
1355
|
// tools — and it said the model was not usable, about a model that had just called
|
|
1303
1356
|
// `plan` successfully one turn earlier. Neither helped, and both pointed away from the
|
|
1304
1357
|
// likely cause.
|
|
1305
|
-
throw new Error(emptyResponseAdvice(config.provider, config.model, emptyTurns, toolsProvenToWork));
|
|
1358
|
+
throw new Error(emptyResponseAdvice(config.provider, config.model, emptyTurns, toolsProvenToWork, resolveProvider(config.provider, config.baseURL).baseURL));
|
|
1306
1359
|
}
|
|
1307
1360
|
}
|
|
1308
1361
|
else {
|
|
@@ -1705,7 +1758,9 @@ initialPlan) {
|
|
|
1705
1758
|
loadAgentInstructions(config.cwd),
|
|
1706
1759
|
getPackSystemPrompt(config.cwd).catch(() => ''),
|
|
1707
1760
|
]);
|
|
1708
|
-
|
|
1761
|
+
// The model and provider go into the context so the prompt can state them. Without them the
|
|
1762
|
+
// agent answers "who are you" from its training rather than from its instructions.
|
|
1763
|
+
const basePrompt = buildSystemPrompt({ ...ctx, model: config.model, provider: config.provider }, memory, project, agentInstructions);
|
|
1709
1764
|
messages.push({ role: 'system', content: packPrompt ? basePrompt + '\n\n' + packPrompt : basePrompt });
|
|
1710
1765
|
}
|
|
1711
1766
|
// Load MCP and plugins only at top level (spawnDepth === 0)
|
|
@@ -1726,15 +1781,12 @@ initialPlan) {
|
|
|
1726
1781
|
// A locally served model is planned around what the server will actually accept, not what the
|
|
1727
1782
|
// model was trained for: Ollama reports the trained length and serves its own much smaller
|
|
1728
1783
|
// default, then truncates the difference in silence.
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
`close to that on its own. Set OLLAMA_CONTEXT_LENGTH=32768 in Ollama's environment for ` +
|
|
1736
|
-
`room to work in.`);
|
|
1737
|
-
}
|
|
1784
|
+
// Judged by the endpoint rather than the provider's name. A LAN Ollama reached through a
|
|
1785
|
+
// provider slot called "omni" is still served by Ollama, and while this asked about the name
|
|
1786
|
+
// that setup got neither the smaller window nor a word of warning.
|
|
1787
|
+
const locallyServed = servesLocally(config.provider, resolveProvider(config.provider, config.baseURL).baseURL);
|
|
1788
|
+
if (!config.contextTokens && locallyServed) {
|
|
1789
|
+
config = { ...config, contextTokens: ollamaServingLimit() };
|
|
1738
1790
|
}
|
|
1739
1791
|
/**
|
|
1740
1792
|
* The window the provider reports, once it answers.
|