Skip to content

Commit cd3ec88

Browse files
committed
fix: show errors for non-LanguageModelError exceptions, extract family name helper, defer provider creation
1 parent c07fced commit cd3ec88

3 files changed

Lines changed: 16 additions & 6 deletions

File tree

src/__tests__/providers/lmApiProvider.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ describe('LmApiProvider', () => {
139139
);
140140
});
141141

142-
it('returns undefined for non-LanguageModelError exceptions', async () => {
142+
it('shows generic error for non-LanguageModelError exceptions', async () => {
143143
const model = createMockModel({
144144
sendRequest: jest.fn().mockRejectedValue(new Error('network error')),
145145
});
@@ -150,6 +150,9 @@ describe('LmApiProvider', () => {
150150

151151
const result = await provider.generateMessage('inst', 'ctx', token);
152152
expect(result).toBeUndefined();
153+
expect(vscode.window.showErrorMessage).toHaveBeenCalledWith(
154+
'Unexpected error: network error'
155+
);
153156
});
154157
});
155158

src/generateCommitMessage.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ export async function generateCommitMessage(
1515

1616
const repoRoot = repo.rootUri.fsPath;
1717
const settings = getSettings();
18-
const provider = createProvider(repoRoot);
1918

2019
const [diffResult, logResult] = await Promise.allSettled([
2120
repo.diff(true),
@@ -41,6 +40,8 @@ export async function generateCommitMessage(
4140
? formatCommitLog(logResult.value)
4241
: '';
4342

43+
const provider = createProvider(repoRoot);
44+
4445
const message = await vscode.window.withProgress(
4546
{
4647
location: vscode.ProgressLocation.Notification,

src/providers/lmApiProvider.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,31 @@ export class LmApiProvider implements CommitMessageProvider {
3333
}
3434
return chunks.join('');
3535
} catch (err) {
36+
const message = err instanceof Error ? err.message : String(err);
3637
if (err instanceof vscode.LanguageModelError) {
37-
vscode.window.showErrorMessage(`Claude request failed: ${err.message}`);
38+
vscode.window.showErrorMessage(`Claude request failed: ${message}`);
39+
} else {
40+
vscode.window.showErrorMessage(`Unexpected error: ${message}`);
3841
}
3942
return undefined;
4043
}
4144
}
4245

46+
private toFamilyName(model: string): string {
47+
return `claude-${model}`;
48+
}
49+
4350
private async selectModel(preferredModel?: string): Promise<vscode.LanguageModelChat | undefined> {
4451
if (preferredModel) {
45-
const familyName = `claude-${preferredModel}`;
46-
const exact = await vscode.lm.selectChatModels({ vendor: 'anthropic', family: familyName });
52+
const exact = await vscode.lm.selectChatModels({ vendor: 'anthropic', family: this.toFamilyName(preferredModel) });
4753
if (exact.length > 0) { return exact[0]; }
4854
}
4955

5056
const anyAnthropic = await vscode.lm.selectChatModels({ vendor: 'anthropic' });
5157
if (anyAnthropic.length > 0) { return anyAnthropic[0]; }
5258

5359
if (preferredModel) {
54-
const byFamily = await vscode.lm.selectChatModels({ family: `claude-${preferredModel}` });
60+
const byFamily = await vscode.lm.selectChatModels({ family: this.toFamilyName(preferredModel) });
5561
if (byFamily.length > 0) { return byFamily[0]; }
5662
}
5763

0 commit comments

Comments
 (0)