[inference] Add cancelation support for chatComplete and output#203108
[inference] Add cancelation support for chatComplete and output#203108pgayvallet merged 13 commits intoelastic:mainfrom
Conversation
|
/ci |
|
/ci |
|
/ci |
|
/ci |
|
Pinging @elastic/appex-ai-infra (Team:AI Infra) |
| }, | ||
| complete: () => { | ||
| if (abortSignal.aborted) { | ||
| subscriber.error(createInferenceRequestAbortedError('Request was aborted')); |
There was a problem hiding this comment.
question What other messages do we envision for these aborted request errors? This is the only place it's called today, and we pass in a hard-coded message.
I am not asking you to change this, I'm just curious if you have thoughts about the future.
There was a problem hiding this comment.
Yeah, that's a fair point. We probably don't need that message to be passed as a parameter to be honest. I was mostly following the pattern that was used for other inference error types. I will change that
| source$.next(3); | ||
|
|
||
| expect(values).toEqual([1, 2]); | ||
| expect(thrownError).toBeDefined(); |
There was a problem hiding this comment.
nit: should we assert the correct error instance is thrown?
| expect(thrownError).toBeDefined(); | |
| expect(thrownError).toBeInstanceOf(InferenceTaskError); | |
| expect(thrownError.code).toBe('requestAborted'); |
💚 Build Succeeded
Metrics [docs]Public APIs missing comments
Page load bundle
History
|
|
Starting backport for target branches: 8.x https://github.com/elastic/kibana/actions/runs/12375857143 |
…tic#203108) ## Summary Fix elastic#200757 Add cancelation support for `chatComplete` and `output`, based on an abort signal. ### Examples #### response mode ```ts import { isInferenceRequestAbortedError } from '@kbn/inference-common'; try { const abortController = new AbortController(); const chatResponse = await inferenceClient.chatComplete({ connectorId: 'some-gen-ai-connector', abortSignal: abortController.signal, messages: [{ role: MessageRole.User, content: 'Do something' }], }); } catch(e) { if(isInferenceRequestAbortedError(e)) { // request was aborted, do something } else { // was another error, do something else } } // elsewhere abortController.abort() ``` #### stream mode ```ts import { isInferenceRequestAbortedError } from '@kbn/inference-common'; const abortController = new AbortController(); const events$ = inferenceClient.chatComplete({ stream: true, connectorId: 'some-gen-ai-connector', abortSignal: abortController.signal, messages: [{ role: MessageRole.User, content: 'Do something' }], }); events$.subscribe({ next: (event) => { // do something }, error: (err) => { if(isInferenceRequestAbortedError(e)) { // request was aborted, do something } else { // was another error, do something else } } }); abortController.abort(); ``` (cherry picked from commit 0b74f62)
💚 All backports created successfully
Note: Successful backport PRs will be merged automatically after passing CI. Questions ?Please refer to the Backport tool documentation |
…#203108) (#204588) # Backport This will backport the following commits from `main` to `8.x`: - [[inference] Add cancelation support for chatComplete and output (#203108)](#203108) <!--- Backport version: 9.4.3 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) <!--BACKPORT [{"author":{"name":"Pierre Gayvallet","email":"pierre.gayvallet@elastic.co"},"sourceCommit":{"committedDate":"2024-12-17T15:13:17Z","message":"[inference] Add cancelation support for chatComplete and output (#203108)\n\n## Summary\r\n\r\nFix https://github.com/elastic/kibana/issues/200757\r\n\r\nAdd cancelation support for `chatComplete` and `output`, based on an\r\nabort signal.\r\n\r\n\r\n### Examples\r\n\r\n#### response mode\r\n\r\n```ts\r\nimport { isInferenceRequestAbortedError } from '@kbn/inference-common';\r\n\r\ntry {\r\n const abortController = new AbortController();\r\n const chatResponse = await inferenceClient.chatComplete({\r\n connectorId: 'some-gen-ai-connector',\r\n abortSignal: abortController.signal,\r\n messages: [{ role: MessageRole.User, content: 'Do something' }],\r\n });\r\n} catch(e) {\r\n if(isInferenceRequestAbortedError(e)) {\r\n // request was aborted, do something\r\n } else {\r\n // was another error, do something else\r\n }\r\n}\r\n\r\n// elsewhere\r\nabortController.abort()\r\n```\r\n\r\n#### stream mode\r\n\r\n```ts\r\nimport { isInferenceRequestAbortedError } from '@kbn/inference-common';\r\n\r\nconst abortController = new AbortController();\r\nconst events$ = inferenceClient.chatComplete({\r\n stream: true,\r\n connectorId: 'some-gen-ai-connector',\r\n abortSignal: abortController.signal,\r\n messages: [{ role: MessageRole.User, content: 'Do something' }],\r\n});\r\n\r\nevents$.subscribe({\r\n next: (event) => {\r\n // do something\r\n },\r\n error: (err) => {\r\n if(isInferenceRequestAbortedError(e)) {\r\n // request was aborted, do something\r\n } else {\r\n // was another error, do something else\r\n }\r\n }\r\n});\r\n\r\nabortController.abort();\r\n```","sha":"0b74f62a338fe1f6b281a019e71279f0d2ffb81f","branchLabelMapping":{"^v9.0.0$":"main","^v8.18.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","v9.0.0","backport:version","Team:AI Infra","v8.18.0"],"title":"[inference] Add cancelation support for chatComplete and output","number":203108,"url":"https://github.com/elastic/kibana/pull/203108","mergeCommit":{"message":"[inference] Add cancelation support for chatComplete and output (#203108)\n\n## Summary\r\n\r\nFix https://github.com/elastic/kibana/issues/200757\r\n\r\nAdd cancelation support for `chatComplete` and `output`, based on an\r\nabort signal.\r\n\r\n\r\n### Examples\r\n\r\n#### response mode\r\n\r\n```ts\r\nimport { isInferenceRequestAbortedError } from '@kbn/inference-common';\r\n\r\ntry {\r\n const abortController = new AbortController();\r\n const chatResponse = await inferenceClient.chatComplete({\r\n connectorId: 'some-gen-ai-connector',\r\n abortSignal: abortController.signal,\r\n messages: [{ role: MessageRole.User, content: 'Do something' }],\r\n });\r\n} catch(e) {\r\n if(isInferenceRequestAbortedError(e)) {\r\n // request was aborted, do something\r\n } else {\r\n // was another error, do something else\r\n }\r\n}\r\n\r\n// elsewhere\r\nabortController.abort()\r\n```\r\n\r\n#### stream mode\r\n\r\n```ts\r\nimport { isInferenceRequestAbortedError } from '@kbn/inference-common';\r\n\r\nconst abortController = new AbortController();\r\nconst events$ = inferenceClient.chatComplete({\r\n stream: true,\r\n connectorId: 'some-gen-ai-connector',\r\n abortSignal: abortController.signal,\r\n messages: [{ role: MessageRole.User, content: 'Do something' }],\r\n});\r\n\r\nevents$.subscribe({\r\n next: (event) => {\r\n // do something\r\n },\r\n error: (err) => {\r\n if(isInferenceRequestAbortedError(e)) {\r\n // request was aborted, do something\r\n } else {\r\n // was another error, do something else\r\n }\r\n }\r\n});\r\n\r\nabortController.abort();\r\n```","sha":"0b74f62a338fe1f6b281a019e71279f0d2ffb81f"}},"sourceBranch":"main","suggestedTargetBranches":["8.x"],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","branchLabelMappingKey":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/203108","number":203108,"mergeCommit":{"message":"[inference] Add cancelation support for chatComplete and output (#203108)\n\n## Summary\r\n\r\nFix https://github.com/elastic/kibana/issues/200757\r\n\r\nAdd cancelation support for `chatComplete` and `output`, based on an\r\nabort signal.\r\n\r\n\r\n### Examples\r\n\r\n#### response mode\r\n\r\n```ts\r\nimport { isInferenceRequestAbortedError } from '@kbn/inference-common';\r\n\r\ntry {\r\n const abortController = new AbortController();\r\n const chatResponse = await inferenceClient.chatComplete({\r\n connectorId: 'some-gen-ai-connector',\r\n abortSignal: abortController.signal,\r\n messages: [{ role: MessageRole.User, content: 'Do something' }],\r\n });\r\n} catch(e) {\r\n if(isInferenceRequestAbortedError(e)) {\r\n // request was aborted, do something\r\n } else {\r\n // was another error, do something else\r\n }\r\n}\r\n\r\n// elsewhere\r\nabortController.abort()\r\n```\r\n\r\n#### stream mode\r\n\r\n```ts\r\nimport { isInferenceRequestAbortedError } from '@kbn/inference-common';\r\n\r\nconst abortController = new AbortController();\r\nconst events$ = inferenceClient.chatComplete({\r\n stream: true,\r\n connectorId: 'some-gen-ai-connector',\r\n abortSignal: abortController.signal,\r\n messages: [{ role: MessageRole.User, content: 'Do something' }],\r\n});\r\n\r\nevents$.subscribe({\r\n next: (event) => {\r\n // do something\r\n },\r\n error: (err) => {\r\n if(isInferenceRequestAbortedError(e)) {\r\n // request was aborted, do something\r\n } else {\r\n // was another error, do something else\r\n }\r\n }\r\n});\r\n\r\nabortController.abort();\r\n```","sha":"0b74f62a338fe1f6b281a019e71279f0d2ffb81f"}},{"branch":"8.x","label":"v8.18.0","branchLabelMappingKey":"^v8.18.0$","isSourceBranch":false,"state":"NOT_CREATED"}]}] BACKPORT--> Co-authored-by: Pierre Gayvallet <pierre.gayvallet@elastic.co>
…tic#203108) ## Summary Fix elastic#200757 Add cancelation support for `chatComplete` and `output`, based on an abort signal. ### Examples #### response mode ```ts import { isInferenceRequestAbortedError } from '@kbn/inference-common'; try { const abortController = new AbortController(); const chatResponse = await inferenceClient.chatComplete({ connectorId: 'some-gen-ai-connector', abortSignal: abortController.signal, messages: [{ role: MessageRole.User, content: 'Do something' }], }); } catch(e) { if(isInferenceRequestAbortedError(e)) { // request was aborted, do something } else { // was another error, do something else } } // elsewhere abortController.abort() ``` #### stream mode ```ts import { isInferenceRequestAbortedError } from '@kbn/inference-common'; const abortController = new AbortController(); const events$ = inferenceClient.chatComplete({ stream: true, connectorId: 'some-gen-ai-connector', abortSignal: abortController.signal, messages: [{ role: MessageRole.User, content: 'Do something' }], }); events$.subscribe({ next: (event) => { // do something }, error: (err) => { if(isInferenceRequestAbortedError(e)) { // request was aborted, do something } else { // was another error, do something else } } }); abortController.abort(); ```
…tic#203108) ## Summary Fix elastic#200757 Add cancelation support for `chatComplete` and `output`, based on an abort signal. ### Examples #### response mode ```ts import { isInferenceRequestAbortedError } from '@kbn/inference-common'; try { const abortController = new AbortController(); const chatResponse = await inferenceClient.chatComplete({ connectorId: 'some-gen-ai-connector', abortSignal: abortController.signal, messages: [{ role: MessageRole.User, content: 'Do something' }], }); } catch(e) { if(isInferenceRequestAbortedError(e)) { // request was aborted, do something } else { // was another error, do something else } } // elsewhere abortController.abort() ``` #### stream mode ```ts import { isInferenceRequestAbortedError } from '@kbn/inference-common'; const abortController = new AbortController(); const events$ = inferenceClient.chatComplete({ stream: true, connectorId: 'some-gen-ai-connector', abortSignal: abortController.signal, messages: [{ role: MessageRole.User, content: 'Do something' }], }); events$.subscribe({ next: (event) => { // do something }, error: (err) => { if(isInferenceRequestAbortedError(e)) { // request was aborted, do something } else { // was another error, do something else } } }); abortController.abort(); ```
…tic#203108) ## Summary Fix elastic#200757 Add cancelation support for `chatComplete` and `output`, based on an abort signal. ### Examples #### response mode ```ts import { isInferenceRequestAbortedError } from '@kbn/inference-common'; try { const abortController = new AbortController(); const chatResponse = await inferenceClient.chatComplete({ connectorId: 'some-gen-ai-connector', abortSignal: abortController.signal, messages: [{ role: MessageRole.User, content: 'Do something' }], }); } catch(e) { if(isInferenceRequestAbortedError(e)) { // request was aborted, do something } else { // was another error, do something else } } // elsewhere abortController.abort() ``` #### stream mode ```ts import { isInferenceRequestAbortedError } from '@kbn/inference-common'; const abortController = new AbortController(); const events$ = inferenceClient.chatComplete({ stream: true, connectorId: 'some-gen-ai-connector', abortSignal: abortController.signal, messages: [{ role: MessageRole.User, content: 'Do something' }], }); events$.subscribe({ next: (event) => { // do something }, error: (err) => { if(isInferenceRequestAbortedError(e)) { // request was aborted, do something } else { // was another error, do something else } } }); abortController.abort(); ```
Summary
Fix #200757
Add cancelation support for
chatCompleteandoutput, based on an abort signal.Examples
response mode
stream mode