22 * LLM pillar — one provider-agnostic `complete()` call.
33 *
44 * SDK-free (`fetch`-based) so the runtime stays dependency-light. Provider is chosen by env, so the
5- * whole market flips from Anthropic (dev default) to the sponsored OpenAI key with `LLM_PROVIDER=openai`
6- * (or to Venice AI with `LLM_PROVIDER=venice`) and no code change. Callers ask for a single JSON-shaped
5+ * whole market flips to Venice AI with `LLM_PROVIDER=venice` (or OpenAI/Anthropic) and no code change.
6+ * Callers ask for a single JSON-shaped
77 * answer and enforce their own guards on it — the model proposes, code disposes.
88 *
99 * To add a provider in code: extend `LlmProvider`, add a `DEFAULT_MODEL` entry, teach `pickProvider()`
@@ -27,6 +27,18 @@ const DEFAULT_MODEL: Record<LlmProvider, string> = {
2727 venice : 'llama-3.3-70b' ,
2828}
2929
30+ const KIMI_MIN_COMPLETION_TOKENS = 1024
31+
32+ /**
33+ * Venice-hosted Kimi code models can spend small budgets on internal reasoning before emitting
34+ * `message.content`. Keep caller limits for other models, but give Kimi enough room to finish JSON.
35+ */
36+ export function effectiveMaxTokens ( provider : LlmProvider , model : string , requested : number ) : number {
37+ return provider === 'venice' && / k i m i / i. test ( model ) && requested < KIMI_MIN_COMPLETION_TOKENS
38+ ? KIMI_MIN_COMPLETION_TOKENS
39+ : requested
40+ }
41+
3042export interface CompleteOpts {
3143 system : string
3244 user : string
@@ -43,9 +55,10 @@ export async function complete(opts: CompleteOpts): Promise<string> {
4355 const provider = pickProvider ( )
4456 // `||` not `??`: coral manifests default unset options to "" — an empty LLM_MODEL must not win.
4557 const model = opts . model || process . env . LLM_MODEL || DEFAULT_MODEL [ provider ]
46- const maxTokens = opts . maxTokens ?? 512
58+ const requestedMaxTokens = opts . maxTokens ?? 512
59+ const maxTokens = effectiveMaxTokens ( provider , model , requestedMaxTokens )
4760 const trace = process . env . TRACE === '1'
48- if ( trace ) console . error ( `[llm] provider=${ provider } model=${ model } ` )
61+ if ( trace ) console . error ( `[llm] provider=${ provider } model=${ model } maxTokens= ${ maxTokens } ` )
4962
5063 const text = provider === 'openai'
5164 ? await completeOpenAI ( opts , model , maxTokens )
0 commit comments