Skip to content

Commit d8d2650

Browse files
Backport PR #1197: Show error icon near cursor on inline completion errors (#1230)
Co-authored-by: Darshan Poudel <[email protected]>
1 parent 81d9f38 commit d8d2650

File tree

4 files changed

+37
-10
lines changed

4 files changed

+37
-10
lines changed

packages/jupyter-ai/jupyter_ai/completions/handlers/base.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,10 @@ async def handle_exc(self, e: Exception, request: InlineCompletionRequest):
129129
`handle_stream_request()`. This base class provides a default
130130
implementation, which may be overridden by subclasses.
131131
"""
132+
title = e.args[0] if e.args else "Exception"
132133
error = CompletionError(
133134
type=e.__class__.__name__,
134-
title=e.args[0] if e.args else "Exception",
135+
title=title,
135136
traceback=traceback.format_exc(),
136137
)
137138
self.reply(

packages/jupyter-ai/jupyter_ai/tests/completions/test_handlers.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,22 @@ class MockProvider(BaseProvider, FakeListLLM):
2121
name = "My Provider"
2222
model_id_key = "model"
2323
models = ["model"]
24+
raise_exc: bool = False
2425

2526
def __init__(self, **kwargs):
2627
if "responses" not in kwargs:
2728
kwargs["responses"] = ["Test response"]
2829
super().__init__(**kwargs)
2930

31+
async def _acall(self, *args, **kwargs):
32+
if self.raise_exc:
33+
raise Exception("Test exception")
34+
else:
35+
return super()._call(*args, **kwargs)
36+
3037

3138
class MockCompletionHandler(DefaultInlineCompletionHandler):
32-
def __init__(self, lm_provider=None, lm_provider_params=None):
39+
def __init__(self, lm_provider=None, lm_provider_params=None, raise_exc=False):
3340
self.request = HTTPServerRequest()
3441
self.application = Application()
3542
self.messages = []
@@ -50,10 +57,6 @@ def reply(
5057
) -> None:
5158
self.messages.append(message)
5259

53-
async def handle_exc(self, e: Exception, _request: InlineCompletionRequest):
54-
# raise all exceptions during testing rather
55-
raise e
56-
5760

5861
@fixture
5962
def inline_handler() -> MockCompletionHandler:
@@ -191,3 +194,21 @@ async def test_handle_stream_request():
191194
assert third.type == "stream"
192195
assert third.response.insertText == "test"
193196
assert third.done is True
197+
198+
199+
async def test_handle_request_with_error(inline_handler):
200+
inline_handler = MockCompletionHandler(
201+
lm_provider=MockProvider,
202+
lm_provider_params={
203+
"model_id": "model",
204+
"responses": ["test"],
205+
"raise_exc": True,
206+
},
207+
)
208+
dummy_request = InlineCompletionRequest(
209+
number=1, prefix="", suffix="", mime="", stream=True
210+
)
211+
await inline_handler.on_message(json.dumps(dict(dummy_request)))
212+
await inline_handler.tasks[0]
213+
error = inline_handler.messages[-1].model_dump().get("error", None)
214+
assert error is not None

packages/jupyter-ai/src/completions/provider.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,19 @@ export class JaiInlineProvider
122122
label: 'Show Traceback',
123123
callback: () => {
124124
showErrorMessage('Inline completion failed on the server side', {
125-
message: error.traceback
125+
message: `${error.title}\n${error.traceback}`
126126
});
127127
}
128128
}
129129
]
130130
});
131-
throw new Error(
132-
`Inline completion failed: ${error.type}\n${error.traceback}`
133-
);
131+
const items = [
132+
{
133+
error: { message: error.title },
134+
insertText: ''
135+
}
136+
];
137+
return { items };
134138
}
135139
return result.list;
136140
}

packages/jupyter-ai/src/completions/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export namespace AiCompleterService {
3535
export type CompletionError = {
3636
type: string;
3737
traceback: string;
38+
title: string;
3839
};
3940

4041
export type InlineCompletionReply = {

0 commit comments

Comments
 (0)