Skip to content

Commit 2f8aece

Browse files
authored
fix(core): token usage and response event type for none stream mode. (#524)
1 parent 01e7bc4 commit 2f8aece

6 files changed

Lines changed: 89 additions & 51 deletions

File tree

packages/core/src/events/AgenticaResponseEvent.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ export interface AgenticaResponseEvent extends AgenticaEventBase<"response"> {
1717
body: OpenAI.ChatCompletionCreateParamsStreaming;
1818

1919
/**
20-
* The text content stream.
20+
* The response data.
2121
*/
22-
stream: AsyncGenerator<OpenAI.ChatCompletionChunk, undefined, undefined>;
22+
response: AgenticaResponseEvent.Response;
2323

2424
/**
2525
* Options for the request.
@@ -31,3 +31,14 @@ export interface AgenticaResponseEvent extends AgenticaEventBase<"response"> {
3131
*/
3232
join: () => Promise<OpenAI.ChatCompletion>;
3333
}
34+
export namespace AgenticaResponseEvent {
35+
export type Response = StreamResponse | NonStreamResponse;
36+
export interface StreamResponse {
37+
stream: true;
38+
data: AsyncGenerator<OpenAI.ChatCompletionChunk, undefined, undefined>;
39+
}
40+
export interface NonStreamResponse {
41+
stream: false;
42+
data: OpenAI.ChatCompletion;
43+
}
44+
}

packages/core/src/factory/events.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ export function createResponseEvent(props: {
330330
source: AgenticaEventSource;
331331
body: OpenAI.ChatCompletionCreateParamsStreaming;
332332
options?: OpenAI.RequestOptions | undefined;
333-
stream: AsyncGenerator<OpenAI.ChatCompletionChunk, undefined, undefined>;
333+
response: AgenticaResponseEvent.Response;
334334
join: () => Promise<OpenAI.ChatCompletion>;
335335
}): AgenticaResponseEvent {
336336
const id: string = v4();
@@ -343,7 +343,7 @@ export function createResponseEvent(props: {
343343
source: props.source,
344344
body: props.body,
345345
options: props.options,
346-
stream: props.stream,
346+
response: props.response,
347347
join: props.join,
348348
};
349349
}

packages/core/src/utils/request.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,27 @@ export function getChatCompletionFunction(props: {
6363
})();
6464

6565
if ("toReadableStream" in completion === false) {
66+
if (completion.usage != null) {
67+
AgenticaTokenUsageAggregator.aggregate({
68+
kind: source,
69+
completionUsage: completion.usage,
70+
usage: props.usage,
71+
});
72+
}
73+
void props.dispatch({
74+
id: v4(),
75+
type: "response",
76+
request_id: event.id,
77+
source,
78+
response: {
79+
stream: false,
80+
data: completion,
81+
},
82+
body: event.body as OpenAI.ChatCompletionCreateParamsStreaming,
83+
options: event.options,
84+
join: async () => completion,
85+
created_at: new Date().toISOString(),
86+
}).catch(() => {});
6687
return {
6788
type: "none-stream",
6889
value: completion,
@@ -101,7 +122,10 @@ export function getChatCompletionFunction(props: {
101122
type: "response",
102123
request_id: event.id,
103124
source,
104-
stream: streamDefaultReaderToAsyncGenerator(streamForStream.getReader(), props.abortSignal),
125+
response: {
126+
stream: true,
127+
data: streamDefaultReaderToAsyncGenerator(streamForStream.getReader(), props.abortSignal),
128+
},
105129
body: event.body as OpenAI.ChatCompletionCreateParamsStreaming,
106130
options: event.options,
107131
join: async () => {

pnpm-lock.yaml

Lines changed: 43 additions & 43 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pnpm-workspace.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ catalogs:
2121
typescript: ~5.9.3
2222
typia:
2323
"@ryoppippi/unplugin-typia": ^2.6.4
24-
"@samchon/openapi": ^6.0.0
25-
typia: ^11.0.0
24+
"@samchon/openapi": ^6.0.1
25+
typia: ^11.0.3
2626
vite:
2727
vitest: ^3.0.9
2828
onlyBuiltDependencies:

0 commit comments

Comments
 (0)