@link-assistant/agent 0.16.5 → 0.16.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@link-assistant/agent",
3
- "version": "0.16.5",
3
+ "version": "0.16.7",
4
4
  "description": "A minimal, public domain AI CLI agent compatible with OpenCode's JSON interface. Bun-only runtime.",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -687,7 +687,7 @@ export namespace Provider {
687
687
  },
688
688
  };
689
689
 
690
- const state = Instance.state(async () => {
690
+ export const state = Instance.state(async () => {
691
691
  using _ = log.time('state');
692
692
  const config = await Config.get();
693
693
  const database = await ModelsDev.get();
@@ -298,6 +298,32 @@ export namespace SessionProcessor {
298
298
  input.assistantMessage.cost += usage.cost;
299
299
  input.assistantMessage.tokens = usage.tokens;
300
300
 
301
+ // Log warning when provider returns zero tokens (#198)
302
+ if (
303
+ usage.tokens.input === 0 &&
304
+ usage.tokens.output === 0 &&
305
+ usage.tokens.reasoning === 0 &&
306
+ finishReason === 'unknown'
307
+ ) {
308
+ log.warn(() => ({
309
+ message:
310
+ 'provider returned zero tokens with unknown finish reason at step level',
311
+ providerID: input.providerID,
312
+ requestedModelID: input.model.id,
313
+ respondedModelID:
314
+ (value as any).response?.modelId ?? 'none',
315
+ rawFinishReason: String(
316
+ value.finishReason ?? 'undefined'
317
+ ),
318
+ rawUsage: JSON.stringify(value.usage ?? null),
319
+ providerMetadata: JSON.stringify(
320
+ value.providerMetadata ?? null
321
+ ),
322
+ issue:
323
+ 'https://github.com/link-assistant/agent/issues/198',
324
+ }));
325
+ }
326
+
301
327
  // Build model info if --output-response-model flag is enabled
302
328
  // @see https://github.com/link-assistant/agent/issues/179
303
329
  const modelInfo: MessageV2.ModelInfo | undefined =
@@ -297,17 +297,29 @@ export namespace SessionPrompt {
297
297
  tokens.output === 0 &&
298
298
  tokens.reasoning === 0
299
299
  ) {
300
+ const errorMessage =
301
+ `Provider returned zero tokens with unknown finish reason. ` +
302
+ `Requested model: ${lastAssistant.model?.requestedModelID ?? 'unknown'} ` +
303
+ `(provider: ${lastAssistant.model?.providerID ?? 'unknown'}). ` +
304
+ `Responded model: ${lastAssistant.model?.respondedModelID ?? 'unknown'}. ` +
305
+ `This usually indicates the provider failed to process the request. ` +
306
+ `Check provider status, model availability, and API keys.`;
300
307
  log.error(() => ({
301
- message:
302
- 'provider returned zero tokens with unknown finish reason - possible API failure',
308
+ message: errorMessage,
303
309
  sessionID,
304
310
  finishReason: lastAssistant.finish,
305
311
  tokens,
306
312
  cost: lastAssistant.cost,
307
313
  model: lastAssistant.model,
308
- hint: 'This usually indicates the provider failed to process the request. Check provider status, model availability, and API keys.',
309
- issue: 'https://github.com/link-assistant/agent/issues/196',
314
+ issue: 'https://github.com/link-assistant/agent/issues/198',
310
315
  }));
316
+ // Publish error event so JSON standard output includes it (#198)
317
+ Bus.publish(Session.Event.Error, {
318
+ sessionID,
319
+ error: new NamedError.Unknown({
320
+ message: errorMessage,
321
+ }).toObject(),
322
+ });
311
323
  break;
312
324
  }
313
325
 
@@ -637,6 +649,8 @@ export namespace SessionPrompt {
637
649
  log.info(() => ({
638
650
  message: 'Model',
639
651
  model: `${model.providerID}/${model.modelID}`,
652
+ apiModelID: model.info?.id ?? model.modelID,
653
+ npm: model.npm,
640
654
  }));
641
655
  log.info(() => ({ message: 'Session ID', sessionID }));
642
656
  log.info(() => ({ message: 'Agent', agent: agent.name }));