Skip to content

Commit b7d385a

Browse files
authored
Use token.js for non-tools calls (#4973)
* deprecate inference() * fix tool_choice. only startModel for Cortex * appease linter * remove sse * add stopInferencing support. temporarily with OpenAI * use abortSignal in token.js * bump token.js version
1 parent ebf79ff commit b7d385a

File tree

8 files changed

+97
-557
lines changed

8 files changed

+97
-557
lines changed

core/src/browser/extensions/engines/EngineManager.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { AIEngine } from './AIEngine'
66
*/
77
export class EngineManager {
88
public engines = new Map<string, AIEngine>()
9+
public controller: AbortController | null = null
910

1011
/**
1112
* Registers an engine.

core/src/browser/extensions/engines/OAIEngine.test.ts

Lines changed: 0 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ import {
1212
ChatCompletionRole,
1313
ContentType,
1414
} from '../../../types'
15-
import { requestInference } from './helpers/sse'
16-
import { ulid } from 'ulidx'
1715

18-
jest.mock('./helpers/sse')
19-
jest.mock('ulidx')
2016
jest.mock('../../events')
2117

2218
class TestOAIEngine extends OAIEngine {
@@ -48,79 +44,6 @@ describe('OAIEngine', () => {
4844
)
4945
})
5046

51-
it('should handle inference request', async () => {
52-
const data: MessageRequest = {
53-
model: { engine: 'test-provider', id: 'test-model' } as any,
54-
threadId: 'test-thread',
55-
type: MessageRequestType.Thread,
56-
assistantId: 'test-assistant',
57-
messages: [{ role: ChatCompletionRole.User, content: 'Hello' }],
58-
}
59-
60-
;(ulid as jest.Mock).mockReturnValue('test-id')
61-
;(requestInference as jest.Mock).mockReturnValue({
62-
subscribe: ({ next, complete }: any) => {
63-
next('test response')
64-
complete()
65-
},
66-
})
67-
68-
await engine.inference(data)
69-
70-
expect(requestInference).toHaveBeenCalledWith(
71-
'http://test-inference-url',
72-
expect.objectContaining({ model: 'test-model' }),
73-
expect.any(Object),
74-
expect.any(AbortController),
75-
{ Authorization: 'Bearer test-token' },
76-
undefined
77-
)
78-
79-
expect(events.emit).toHaveBeenCalledWith(
80-
MessageEvent.OnMessageResponse,
81-
expect.objectContaining({ id: 'test-id' })
82-
)
83-
expect(events.emit).toHaveBeenCalledWith(
84-
MessageEvent.OnMessageUpdate,
85-
expect.objectContaining({
86-
content: [
87-
{
88-
type: ContentType.Text,
89-
text: { value: 'test response', annotations: [] },
90-
},
91-
],
92-
status: MessageStatus.Ready,
93-
})
94-
)
95-
})
96-
97-
it('should handle inference error', async () => {
98-
const data: MessageRequest = {
99-
model: { engine: 'test-provider', id: 'test-model' } as any,
100-
threadId: 'test-thread',
101-
type: MessageRequestType.Thread,
102-
assistantId: 'test-assistant',
103-
messages: [{ role: ChatCompletionRole.User, content: 'Hello' }],
104-
}
105-
106-
;(ulid as jest.Mock).mockReturnValue('test-id')
107-
;(requestInference as jest.Mock).mockReturnValue({
108-
subscribe: ({ error }: any) => {
109-
error({ message: 'test error', code: 500 })
110-
},
111-
})
112-
113-
await engine.inference(data)
114-
115-
expect(events.emit).toHaveBeenLastCalledWith(
116-
MessageEvent.OnMessageUpdate,
117-
expect.objectContaining({
118-
status: 'error',
119-
error_code: 500,
120-
})
121-
)
122-
})
123-
12447
it('should stop inference', () => {
12548
engine.stopInference()
12649
expect(engine.isCancelled).toBe(true)

core/src/browser/extensions/engines/OAIEngine.ts

Lines changed: 0 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,9 @@
1-
import { requestInference } from './helpers/sse'
2-
import { ulid } from 'ulidx'
31
import { AIEngine } from './AIEngine'
42
import {
5-
ChatCompletionRole,
6-
ContentType,
73
InferenceEvent,
84
MessageEvent,
95
MessageRequest,
10-
MessageRequestType,
11-
MessageStatus,
126
Model,
13-
ModelInfo,
14-
ThreadContent,
15-
ThreadMessage,
167
} from '../../../types'
178
import { events } from '../../events'
189

@@ -53,112 +44,6 @@ export abstract class OAIEngine extends AIEngine {
5344
*/
5445
override onUnload(): void {}
5546

56-
/*
57-
* Inference request
58-
*/
59-
override async inference(data: MessageRequest) {
60-
if (!data.model?.id) {
61-
events.emit(MessageEvent.OnMessageResponse, {
62-
status: MessageStatus.Error,
63-
content: [
64-
{
65-
type: ContentType.Text,
66-
text: {
67-
value: 'No model ID provided',
68-
annotations: [],
69-
},
70-
},
71-
],
72-
})
73-
return
74-
}
75-
76-
const timestamp = Date.now() / 1000
77-
const message: ThreadMessage = {
78-
id: ulid(),
79-
thread_id: data.thread?.id ?? data.threadId,
80-
type: data.type,
81-
assistant_id: data.assistantId,
82-
role: ChatCompletionRole.Assistant,
83-
content: [],
84-
status: MessageStatus.Pending,
85-
created_at: timestamp,
86-
completed_at: timestamp,
87-
object: 'thread.message',
88-
}
89-
90-
if (data.type !== MessageRequestType.Summary) {
91-
events.emit(MessageEvent.OnMessageResponse, message)
92-
}
93-
94-
this.isCancelled = false
95-
this.controller = new AbortController()
96-
97-
const model: ModelInfo = {
98-
...(this.loadedModel ? this.loadedModel : {}),
99-
...data.model,
100-
}
101-
102-
const header = await this.headers()
103-
let requestBody = {
104-
messages: data.messages ?? [],
105-
model: model.id,
106-
stream: true,
107-
tools: data.tools,
108-
...model.parameters,
109-
}
110-
if (this.transformPayload) {
111-
requestBody = this.transformPayload(requestBody)
112-
}
113-
114-
requestInference(
115-
this.inferenceUrl,
116-
requestBody,
117-
model,
118-
this.controller,
119-
header,
120-
this.transformResponse
121-
).subscribe({
122-
next: (content: any) => {
123-
const messageContent: ThreadContent = {
124-
type: ContentType.Text,
125-
text: {
126-
value: content.trim(),
127-
annotations: [],
128-
},
129-
}
130-
message.content = [messageContent]
131-
events.emit(MessageEvent.OnMessageUpdate, message)
132-
},
133-
complete: async () => {
134-
message.status = message.content.length
135-
? MessageStatus.Ready
136-
: MessageStatus.Error
137-
events.emit(MessageEvent.OnMessageUpdate, message)
138-
},
139-
error: async (err: any) => {
140-
if (this.isCancelled || message.content.length) {
141-
message.status = MessageStatus.Stopped
142-
events.emit(MessageEvent.OnMessageUpdate, message)
143-
return
144-
}
145-
message.status = MessageStatus.Error
146-
message.content[0] = {
147-
type: ContentType.Text,
148-
text: {
149-
value:
150-
typeof message === 'string'
151-
? err.message
152-
: (JSON.stringify(err.message) ?? err.detail),
153-
annotations: [],
154-
},
155-
}
156-
message.error_code = err.code
157-
events.emit(MessageEvent.OnMessageUpdate, message)
158-
},
159-
})
160-
}
161-
16247
/**
16348
* Stops the inference.
16449
*/

core/src/browser/extensions/engines/helpers/sse.test.ts

Lines changed: 0 additions & 146 deletions
This file was deleted.

0 commit comments

Comments
 (0)