@qwen-code/arena-agent 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +52 -0
- package/README.md +436 -0
- package/dist/agent.d.ts +33 -0
- package/dist/agent.js +366 -0
- package/dist/agent.js.map +1 -0
- package/dist/attachments.d.ts +29 -0
- package/dist/attachments.js +222 -0
- package/dist/attachments.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +256 -0
- package/dist/cli.js.map +1 -0
- package/dist/compaction.d.ts +15 -0
- package/dist/compaction.js +176 -0
- package/dist/compaction.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.js +61 -0
- package/dist/config.js.map +1 -0
- package/dist/document-reader.d.ts +18 -0
- package/dist/document-reader.js +423 -0
- package/dist/document-reader.js.map +1 -0
- package/dist/fetch-page.d.ts +25 -0
- package/dist/fetch-page.js +428 -0
- package/dist/fetch-page.js.map +1 -0
- package/dist/history.d.ts +5 -0
- package/dist/history.js +31 -0
- package/dist/history.js.map +1 -0
- package/dist/mock.d.ts +4 -0
- package/dist/mock.js +151 -0
- package/dist/mock.js.map +1 -0
- package/dist/protocol.d.ts +23 -0
- package/dist/protocol.js +84 -0
- package/dist/protocol.js.map +1 -0
- package/dist/provider.d.ts +31 -0
- package/dist/provider.js +308 -0
- package/dist/provider.js.map +1 -0
- package/dist/sdk.d.ts +181 -0
- package/dist/sdk.js +674 -0
- package/dist/sdk.js.map +1 -0
- package/dist/server.d.ts +15 -0
- package/dist/server.js +1433 -0
- package/dist/server.js.map +1 -0
- package/dist/spec.d.ts +11 -0
- package/dist/spec.js +198 -0
- package/dist/spec.js.map +1 -0
- package/dist/tools.d.ts +38 -0
- package/dist/tools.js +992 -0
- package/dist/tools.js.map +1 -0
- package/dist/tui.d.ts +10 -0
- package/dist/tui.js +350 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +146 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/web/app.d.ts +1 -0
- package/dist/web/app.js +1082 -0
- package/dist/web/app.js.map +1 -0
- package/docs/SDK.md +521 -0
- package/package.json +59 -0
- package/spec/message.json +150 -0
- package/spec/tools.json +418 -0
- package/web/arena-logo.svg +11 -0
- package/web/fonts.css +67 -0
- package/web/index.html +285 -0
- package/web/styles.css +1798 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AgentEvent, AgentResult, Message, ModelDelta, Question } from "./types.js";
|
|
2
|
+
export type OutputFormat = "text" | "json" | "stream-json" | "silent";
|
|
3
|
+
export interface EventSinkOptions {
|
|
4
|
+
format: OutputFormat;
|
|
5
|
+
write?: (value: string) => void;
|
|
6
|
+
onEvent?: (event: AgentEvent | AgentResult) => void;
|
|
7
|
+
}
|
|
8
|
+
export declare class EventSink {
|
|
9
|
+
private readonly options;
|
|
10
|
+
private readonly write;
|
|
11
|
+
constructor(options: EventSinkOptions);
|
|
12
|
+
emit(event: AgentEvent | AgentResult): void;
|
|
13
|
+
start(sessionId: string, messages: Message[]): void;
|
|
14
|
+
delta(sessionId: string, delta: ModelDelta): void;
|
|
15
|
+
modelStart(sessionId: string, step: number): void;
|
|
16
|
+
modelRetry(sessionId: string, attempt: number, reason?: string): void;
|
|
17
|
+
modelComplete(sessionId: string, step: number, finishReason: string): void;
|
|
18
|
+
toolStart(sessionId: string, toolCallId: string, toolName: string): void;
|
|
19
|
+
toolComplete(sessionId: string, toolCallId: string, toolName: string): void;
|
|
20
|
+
inputRequired(sessionId: string, toolCallId: string, questions: Question[]): void;
|
|
21
|
+
message(sessionId: string, message: Message, messages: Message[]): void;
|
|
22
|
+
result(sessionId: string, status: AgentResult["status"], messages: Message[], error?: string): AgentResult;
|
|
23
|
+
}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export class EventSink {
|
|
2
|
+
options;
|
|
3
|
+
write;
|
|
4
|
+
constructor(options) {
|
|
5
|
+
this.options = options;
|
|
6
|
+
this.write = options.write || ((value) => process.stdout.write(value));
|
|
7
|
+
}
|
|
8
|
+
emit(event) {
|
|
9
|
+
this.options.onEvent?.(event);
|
|
10
|
+
if (this.options.format === "stream-json") {
|
|
11
|
+
this.write(`${JSON.stringify(event)}\n`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
start(sessionId, messages) {
|
|
15
|
+
this.emit({ type: "start", session_id: sessionId, messages });
|
|
16
|
+
}
|
|
17
|
+
delta(sessionId, delta) {
|
|
18
|
+
this.emit({ type: "assistant.delta", session_id: sessionId, delta });
|
|
19
|
+
}
|
|
20
|
+
modelStart(sessionId, step) {
|
|
21
|
+
this.emit({ type: "model.start", session_id: sessionId, step });
|
|
22
|
+
}
|
|
23
|
+
modelRetry(sessionId, attempt, reason) {
|
|
24
|
+
this.emit({
|
|
25
|
+
type: "model.retry",
|
|
26
|
+
session_id: sessionId,
|
|
27
|
+
attempt,
|
|
28
|
+
...(reason ? { error: reason } : {}),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
modelComplete(sessionId, step, finishReason) {
|
|
32
|
+
this.emit({
|
|
33
|
+
type: "model.complete",
|
|
34
|
+
session_id: sessionId,
|
|
35
|
+
step,
|
|
36
|
+
finish_reason: finishReason,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
toolStart(sessionId, toolCallId, toolName) {
|
|
40
|
+
this.emit({
|
|
41
|
+
type: "tool.start",
|
|
42
|
+
session_id: sessionId,
|
|
43
|
+
tool_call_id: toolCallId,
|
|
44
|
+
tool_name: toolName,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
toolComplete(sessionId, toolCallId, toolName) {
|
|
48
|
+
this.emit({
|
|
49
|
+
type: "tool.complete",
|
|
50
|
+
session_id: sessionId,
|
|
51
|
+
tool_call_id: toolCallId,
|
|
52
|
+
tool_name: toolName,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
inputRequired(sessionId, toolCallId, questions) {
|
|
56
|
+
this.emit({
|
|
57
|
+
type: "input.required",
|
|
58
|
+
session_id: sessionId,
|
|
59
|
+
request_id: toolCallId,
|
|
60
|
+
tool_call_id: toolCallId,
|
|
61
|
+
questions,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
message(sessionId, message, messages) {
|
|
65
|
+
this.emit({
|
|
66
|
+
type: "message",
|
|
67
|
+
session_id: sessionId,
|
|
68
|
+
message,
|
|
69
|
+
messages,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
result(sessionId, status, messages, error) {
|
|
73
|
+
const event = {
|
|
74
|
+
type: "result",
|
|
75
|
+
session_id: sessionId,
|
|
76
|
+
status,
|
|
77
|
+
messages,
|
|
78
|
+
...(error ? { error } : {}),
|
|
79
|
+
};
|
|
80
|
+
this.emit(event);
|
|
81
|
+
return event;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,SAAS;IAGS,OAAO;IAFnB,KAAK,CAA0B;IAEhD,YAA6B,OAAyB;uBAAzB,OAAO;QAClC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,KAA+B;QAClC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAiB,EAAE,QAAmB;QAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,SAAiB,EAAE,KAAiB;QACxC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,UAAU,CAAC,SAAiB,EAAE,IAAY;QACxC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,UAAU,CAAC,SAAiB,EAAE,OAAe,EAAE,MAAe;QAC5D,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,SAAS;YACrB,OAAO;YACP,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CACX,SAAiB,EACjB,IAAY,EACZ,YAAoB;QAEpB,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,gBAAgB;YACtB,UAAU,EAAE,SAAS;YACrB,IAAI;YACJ,aAAa,EAAE,YAAY;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,SAAiB,EAAE,UAAkB,EAAE,QAAgB;QAC/D,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,SAAS;YACrB,YAAY,EAAE,UAAU;YACxB,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,UAAkB,EAAE,QAAgB;QAClE,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,eAAe;YACrB,UAAU,EAAE,SAAS;YACrB,YAAY,EAAE,UAAU;YACxB,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CACX,SAAiB,EACjB,UAAkB,EAClB,SAAqB;QAErB,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,gBAAgB;YACtB,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE,UAAU;YACtB,YAAY,EAAE,UAAU;YACxB,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,OAAgB,EAAE,QAAmB;QAC9D,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,SAAS;YACrB,OAAO;YACP,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CACJ,SAAiB,EACjB,MAA6B,EAC7B,QAAmB,EACnB,KAAc;QAEd,MAAM,KAAK,GAAgB;YACzB,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,SAAS;YACrB,MAAM;YACN,QAAQ;YACR,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ArenaConfig } from "./config.js";
|
|
2
|
+
import type { ModelChunk, ModelClient, ModelRequest } from "./types.js";
|
|
3
|
+
interface HttpModelClientOptions {
|
|
4
|
+
fetch?: typeof globalThis.fetch;
|
|
5
|
+
sleep?: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
|
|
6
|
+
random?: () => number;
|
|
7
|
+
now?: () => number;
|
|
8
|
+
}
|
|
9
|
+
export interface ApiConnection {
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
apiKey: string;
|
|
12
|
+
model: string;
|
|
13
|
+
provider: string;
|
|
14
|
+
liteLlmProxy: boolean;
|
|
15
|
+
headers: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
export declare function resolveApiConnection(config: ArenaConfig, requestedModel?: string): ApiConnection;
|
|
18
|
+
export declare function apiEndpoint(connection: ApiConnection, pathname: string): string;
|
|
19
|
+
export declare class HttpModelClient implements ModelClient {
|
|
20
|
+
private readonly config;
|
|
21
|
+
private readonly fetch;
|
|
22
|
+
private readonly sleep;
|
|
23
|
+
private readonly random;
|
|
24
|
+
private readonly now;
|
|
25
|
+
constructor(config: ArenaConfig, options?: HttpModelClientOptions);
|
|
26
|
+
private retryDelay;
|
|
27
|
+
private completionResponse;
|
|
28
|
+
stream(request: ModelRequest): AsyncIterable<ModelChunk>;
|
|
29
|
+
}
|
|
30
|
+
export declare function checkedFetch(connection: ApiConnection, pathname: string, init: RequestInit): Promise<Response>;
|
|
31
|
+
export {};
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
function withoutTrailingSlash(value) {
|
|
2
|
+
return value.replace(/\/+$/, "");
|
|
3
|
+
}
|
|
4
|
+
function retryableStatus(status) {
|
|
5
|
+
return status === 408 || status === 409 || status === 429 || status >= 500;
|
|
6
|
+
}
|
|
7
|
+
function retryAfterMilliseconds(response, now) {
|
|
8
|
+
const value = response.headers.get("retry-after")?.trim();
|
|
9
|
+
if (!value)
|
|
10
|
+
return undefined;
|
|
11
|
+
const seconds = Number(value);
|
|
12
|
+
if (Number.isFinite(seconds) && seconds >= 0) {
|
|
13
|
+
return seconds * 1000;
|
|
14
|
+
}
|
|
15
|
+
const date = Date.parse(value);
|
|
16
|
+
if (!Number.isFinite(date))
|
|
17
|
+
return undefined;
|
|
18
|
+
return Math.max(0, date - now());
|
|
19
|
+
}
|
|
20
|
+
function abortableSleep(milliseconds, signal) {
|
|
21
|
+
if (signal?.aborted)
|
|
22
|
+
return Promise.reject(signal.reason);
|
|
23
|
+
if (milliseconds <= 0)
|
|
24
|
+
return Promise.resolve();
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
const timeout = setTimeout(complete, milliseconds);
|
|
27
|
+
const abort = () => complete(signal?.reason);
|
|
28
|
+
function complete(error) {
|
|
29
|
+
clearTimeout(timeout);
|
|
30
|
+
signal?.removeEventListener("abort", abort);
|
|
31
|
+
if (error !== undefined)
|
|
32
|
+
reject(error);
|
|
33
|
+
else
|
|
34
|
+
resolve();
|
|
35
|
+
}
|
|
36
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// Histories store multimodal user content in Arena's native part format
|
|
40
|
+
// ({image}/{text}); chat-completions endpoints expect OpenAI-style parts,
|
|
41
|
+
// so the translation happens here at the wire boundary only.
|
|
42
|
+
function wireContentPart(part) {
|
|
43
|
+
if (typeof part.type === "string")
|
|
44
|
+
return part;
|
|
45
|
+
if (typeof part.image === "string") {
|
|
46
|
+
return {
|
|
47
|
+
type: "image_url",
|
|
48
|
+
image_url: { url: part.image, detail: "auto" },
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return { type: "text", text: String(part.text ?? "") };
|
|
52
|
+
}
|
|
53
|
+
function wireMessages(messages) {
|
|
54
|
+
return messages.map((message) => message.role === "user" && Array.isArray(message.content)
|
|
55
|
+
? {
|
|
56
|
+
role: "user",
|
|
57
|
+
content: message.content.map((part) => wireContentPart(part)),
|
|
58
|
+
}
|
|
59
|
+
: message);
|
|
60
|
+
}
|
|
61
|
+
function stripProviderPrefix(model) {
|
|
62
|
+
const separator = model.indexOf("/");
|
|
63
|
+
if (separator === -1)
|
|
64
|
+
return { provider: "openai", model };
|
|
65
|
+
return {
|
|
66
|
+
provider: model.slice(0, separator),
|
|
67
|
+
model: model.slice(separator + 1),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function resolveApiConnection(config, requestedModel = config.model) {
|
|
71
|
+
if (config.liteLlmProxyUrl) {
|
|
72
|
+
const apiKey = config.liteLlmApiKey || config.apiKey || process.env.LITELLM_API_KEY || "";
|
|
73
|
+
return {
|
|
74
|
+
baseUrl: withoutTrailingSlash(config.liteLlmProxyUrl),
|
|
75
|
+
apiKey,
|
|
76
|
+
model: requestedModel,
|
|
77
|
+
provider: "litellm",
|
|
78
|
+
liteLlmProxy: true,
|
|
79
|
+
headers: apiKey ? { authorization: `Bearer ${apiKey}` } : {},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const parsed = stripProviderPrefix(requestedModel);
|
|
83
|
+
const provider = parsed.provider === "google" ? "gemini" : parsed.provider.toLowerCase();
|
|
84
|
+
let baseUrl = config.apiBase;
|
|
85
|
+
let apiKey = config.apiKey;
|
|
86
|
+
const headers = {};
|
|
87
|
+
if (!baseUrl) {
|
|
88
|
+
if (provider === "anthropic") {
|
|
89
|
+
baseUrl = "https://api.anthropic.com/v1";
|
|
90
|
+
apiKey ||= process.env.ANTHROPIC_API_KEY;
|
|
91
|
+
}
|
|
92
|
+
else if (provider === "gemini") {
|
|
93
|
+
baseUrl = "https://generativelanguage.googleapis.com/v1beta/openai";
|
|
94
|
+
apiKey ||= process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
baseUrl = process.env.OPENAI_BASE_URL || "https://api.openai.com/v1";
|
|
98
|
+
apiKey ||= process.env.OPENAI_API_KEY;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
apiKey ||=
|
|
103
|
+
process.env.OPENAI_API_KEY ||
|
|
104
|
+
process.env.ANTHROPIC_API_KEY ||
|
|
105
|
+
process.env.GEMINI_API_KEY ||
|
|
106
|
+
process.env.GOOGLE_API_KEY;
|
|
107
|
+
}
|
|
108
|
+
if (!apiKey) {
|
|
109
|
+
throw new Error(`No API key configured for ${provider}; set ARENA_API_KEY or the provider key`);
|
|
110
|
+
}
|
|
111
|
+
headers.authorization = `Bearer ${apiKey}`;
|
|
112
|
+
if (provider === "anthropic") {
|
|
113
|
+
headers["x-api-key"] = apiKey;
|
|
114
|
+
headers["anthropic-version"] = "2023-06-01";
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
baseUrl: withoutTrailingSlash(baseUrl),
|
|
118
|
+
apiKey,
|
|
119
|
+
model: parsed.model,
|
|
120
|
+
provider,
|
|
121
|
+
liteLlmProxy: false,
|
|
122
|
+
headers,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export function apiEndpoint(connection, pathname) {
|
|
126
|
+
const normalized = pathname.startsWith("/") ? pathname : `/${pathname}`;
|
|
127
|
+
if (connection.baseUrl.endsWith(normalized))
|
|
128
|
+
return connection.baseUrl;
|
|
129
|
+
return `${connection.baseUrl}${normalized}`;
|
|
130
|
+
}
|
|
131
|
+
async function responseError(response) {
|
|
132
|
+
const text = await response.text();
|
|
133
|
+
let detail = text;
|
|
134
|
+
try {
|
|
135
|
+
const parsed = JSON.parse(text);
|
|
136
|
+
detail =
|
|
137
|
+
(typeof parsed.error === "string"
|
|
138
|
+
? parsed.error
|
|
139
|
+
: parsed.error?.message) ||
|
|
140
|
+
parsed.message ||
|
|
141
|
+
text;
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Keep the response body as the diagnostic.
|
|
145
|
+
}
|
|
146
|
+
return new Error(`Model request failed (${response.status} ${response.statusText}): ${detail.slice(0, 2000)}`);
|
|
147
|
+
}
|
|
148
|
+
async function* parseSse(stream) {
|
|
149
|
+
const reader = stream.getReader();
|
|
150
|
+
const decoder = new TextDecoder();
|
|
151
|
+
let buffer = "";
|
|
152
|
+
while (true) {
|
|
153
|
+
const { done, value } = await reader.read();
|
|
154
|
+
buffer += decoder.decode(value, { stream: !done }).replace(/\r\n/g, "\n");
|
|
155
|
+
let boundary = buffer.indexOf("\n\n");
|
|
156
|
+
while (boundary !== -1) {
|
|
157
|
+
const frame = buffer.slice(0, boundary);
|
|
158
|
+
buffer = buffer.slice(boundary + 2);
|
|
159
|
+
const payload = frame
|
|
160
|
+
.split("\n")
|
|
161
|
+
.filter((line) => line.startsWith("data:"))
|
|
162
|
+
.map((line) => line.slice(5).trimStart())
|
|
163
|
+
.join("\n");
|
|
164
|
+
if (payload && payload !== "[DONE]") {
|
|
165
|
+
yield JSON.parse(payload);
|
|
166
|
+
}
|
|
167
|
+
boundary = buffer.indexOf("\n\n");
|
|
168
|
+
}
|
|
169
|
+
if (done)
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
const payload = buffer
|
|
173
|
+
.split("\n")
|
|
174
|
+
.filter((line) => line.startsWith("data:"))
|
|
175
|
+
.map((line) => line.slice(5).trimStart())
|
|
176
|
+
.join("\n");
|
|
177
|
+
if (payload && payload !== "[DONE]") {
|
|
178
|
+
yield JSON.parse(payload);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function fallbackChunk(value) {
|
|
182
|
+
const choices = (value.choices || []);
|
|
183
|
+
return {
|
|
184
|
+
choices: choices.map((choice) => {
|
|
185
|
+
const message = (choice.message || {});
|
|
186
|
+
return {
|
|
187
|
+
delta: {
|
|
188
|
+
content: message.content,
|
|
189
|
+
reasoning_content: (message.reasoning_content ||
|
|
190
|
+
message.reasoning),
|
|
191
|
+
tool_calls: message.tool_calls,
|
|
192
|
+
},
|
|
193
|
+
finish_reason: choice.finish_reason,
|
|
194
|
+
};
|
|
195
|
+
}),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
export class HttpModelClient {
|
|
199
|
+
config;
|
|
200
|
+
fetch;
|
|
201
|
+
sleep;
|
|
202
|
+
random;
|
|
203
|
+
now;
|
|
204
|
+
constructor(config, options = {}) {
|
|
205
|
+
this.config = config;
|
|
206
|
+
this.fetch = options.fetch || globalThis.fetch.bind(globalThis);
|
|
207
|
+
this.sleep = options.sleep || abortableSleep;
|
|
208
|
+
this.random = options.random || Math.random;
|
|
209
|
+
this.now = options.now || Date.now;
|
|
210
|
+
}
|
|
211
|
+
retryDelay(response, retry) {
|
|
212
|
+
const maximum = Math.max(0, this.config.modelRetryMaxMs ?? 30000);
|
|
213
|
+
const retryAfter = response
|
|
214
|
+
? retryAfterMilliseconds(response, this.now)
|
|
215
|
+
: undefined;
|
|
216
|
+
if (retryAfter !== undefined)
|
|
217
|
+
return Math.min(maximum, retryAfter);
|
|
218
|
+
const base = Math.max(0, this.config.modelRetryBaseMs ?? 1000);
|
|
219
|
+
const exponential = Math.min(maximum, base * 2 ** Math.min(retry, 30));
|
|
220
|
+
return Math.floor(exponential * this.random());
|
|
221
|
+
}
|
|
222
|
+
async completionResponse(url, init) {
|
|
223
|
+
const maxRetries = Math.max(0, Math.floor(this.config.modelMaxRetries ?? 5));
|
|
224
|
+
for (let retry = 0;; retry += 1) {
|
|
225
|
+
init.signal?.throwIfAborted();
|
|
226
|
+
let response;
|
|
227
|
+
try {
|
|
228
|
+
response = await this.fetch(url, init);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
if (init.signal?.aborted)
|
|
232
|
+
throw init.signal.reason || error;
|
|
233
|
+
if (!(error instanceof TypeError) || retry >= maxRetries)
|
|
234
|
+
throw error;
|
|
235
|
+
await this.sleep(this.retryDelay(undefined, retry), init.signal || undefined);
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
if (response.ok ||
|
|
239
|
+
!retryableStatus(response.status) ||
|
|
240
|
+
retry >= maxRetries) {
|
|
241
|
+
return response;
|
|
242
|
+
}
|
|
243
|
+
const wait = this.retryDelay(response, retry);
|
|
244
|
+
await response.body?.cancel().catch(() => undefined);
|
|
245
|
+
await this.sleep(wait, init.signal || undefined);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
async *stream(request) {
|
|
249
|
+
const connection = resolveApiConnection(this.config, request.model);
|
|
250
|
+
const body = {
|
|
251
|
+
model: connection.model,
|
|
252
|
+
messages: wireMessages(request.messages),
|
|
253
|
+
tools: request.tools,
|
|
254
|
+
tool_choice: request.toolChoice,
|
|
255
|
+
temperature: request.temperature,
|
|
256
|
+
max_tokens: request.maxTokens,
|
|
257
|
+
stream: true,
|
|
258
|
+
};
|
|
259
|
+
if (request.enableThinking) {
|
|
260
|
+
if (connection.liteLlmProxy) {
|
|
261
|
+
body.thinking = {
|
|
262
|
+
type: "enabled",
|
|
263
|
+
budget_tokens: request.thinkingBudget,
|
|
264
|
+
};
|
|
265
|
+
body.drop_params = true;
|
|
266
|
+
}
|
|
267
|
+
else if (connection.baseUrl.includes("dashscope.aliyuncs.com")) {
|
|
268
|
+
body.enable_thinking = true;
|
|
269
|
+
body.thinking_budget = request.thinkingBudget;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (process.env.ARENA_EXTRA_BODY) {
|
|
273
|
+
const extra = JSON.parse(process.env.ARENA_EXTRA_BODY);
|
|
274
|
+
Object.assign(body, extra);
|
|
275
|
+
}
|
|
276
|
+
const response = await this.completionResponse(apiEndpoint(connection, "/chat/completions"), {
|
|
277
|
+
method: "POST",
|
|
278
|
+
headers: {
|
|
279
|
+
"content-type": "application/json",
|
|
280
|
+
...connection.headers,
|
|
281
|
+
},
|
|
282
|
+
body: JSON.stringify(body),
|
|
283
|
+
signal: request.signal,
|
|
284
|
+
});
|
|
285
|
+
if (!response.ok)
|
|
286
|
+
throw await responseError(response);
|
|
287
|
+
if (response.body &&
|
|
288
|
+
(response.headers.get("content-type") || "").includes("text/event-stream")) {
|
|
289
|
+
yield* parseSse(response.body);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
const value = (await response.json());
|
|
293
|
+
yield fallbackChunk(value);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
export async function checkedFetch(connection, pathname, init) {
|
|
297
|
+
const response = await fetch(apiEndpoint(connection, pathname), {
|
|
298
|
+
...init,
|
|
299
|
+
headers: {
|
|
300
|
+
...connection.headers,
|
|
301
|
+
...(init.headers || {}),
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
if (!response.ok)
|
|
305
|
+
throw await responseError(response);
|
|
306
|
+
return response;
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk.d.ts
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import type { Message, Question } from "./types.js";
|
|
2
|
+
type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
3
|
+
export interface ArenaLocation {
|
|
4
|
+
city?: string;
|
|
5
|
+
region?: string;
|
|
6
|
+
country?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ArenaClientContext {
|
|
9
|
+
currentDate: string;
|
|
10
|
+
timezone: string;
|
|
11
|
+
location?: ArenaLocation;
|
|
12
|
+
}
|
|
13
|
+
export interface ArenaCredentials {
|
|
14
|
+
sessionId: string;
|
|
15
|
+
token: string;
|
|
16
|
+
expiresAt?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ArenaClientOptions {
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
fetch?: FetchLike;
|
|
21
|
+
credentials?: RequestCredentials;
|
|
22
|
+
onCredentials?: (credentials: ArenaCredentials) => void;
|
|
23
|
+
}
|
|
24
|
+
export interface ArenaCreateSessionOptions {
|
|
25
|
+
currentDate?: string;
|
|
26
|
+
timezone?: string;
|
|
27
|
+
location?: ArenaLocation;
|
|
28
|
+
signal?: AbortSignal;
|
|
29
|
+
}
|
|
30
|
+
export interface ArenaConfigResponse {
|
|
31
|
+
model: string;
|
|
32
|
+
protocol: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ArenaHistory {
|
|
35
|
+
messages: Message[];
|
|
36
|
+
lastEventId: string;
|
|
37
|
+
activePrompt: string | null;
|
|
38
|
+
}
|
|
39
|
+
export interface ArenaAttachment {
|
|
40
|
+
name: string;
|
|
41
|
+
path: string;
|
|
42
|
+
mimeType: string;
|
|
43
|
+
size: number;
|
|
44
|
+
url?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface ArenaUpload {
|
|
47
|
+
name: string;
|
|
48
|
+
data: Blob | Uint8Array | ArrayBuffer;
|
|
49
|
+
type?: string;
|
|
50
|
+
}
|
|
51
|
+
export type ArenaUploadInput = ArenaUpload | (Blob & {
|
|
52
|
+
readonly name?: string;
|
|
53
|
+
});
|
|
54
|
+
export interface ArenaAnswer {
|
|
55
|
+
questionId: string;
|
|
56
|
+
optionId?: string;
|
|
57
|
+
customResponse?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ArenaInputRequest {
|
|
60
|
+
requestId: string;
|
|
61
|
+
toolCallId: string;
|
|
62
|
+
questions: Question[];
|
|
63
|
+
}
|
|
64
|
+
export interface ArenaSendOptions {
|
|
65
|
+
input?: string;
|
|
66
|
+
files?: ArenaUploadInput[];
|
|
67
|
+
attachments?: ArenaAttachment[];
|
|
68
|
+
messageId?: string;
|
|
69
|
+
metadata?: Record<string, unknown>;
|
|
70
|
+
signal?: AbortSignal;
|
|
71
|
+
}
|
|
72
|
+
export interface ArenaSendResult {
|
|
73
|
+
accepted: boolean;
|
|
74
|
+
sessionId: string;
|
|
75
|
+
messageId: string;
|
|
76
|
+
attachments: ArenaAttachment[];
|
|
77
|
+
}
|
|
78
|
+
export interface ArenaServerEvent {
|
|
79
|
+
type: string;
|
|
80
|
+
eventId?: string;
|
|
81
|
+
[key: string]: unknown;
|
|
82
|
+
}
|
|
83
|
+
export type ArenaConnectionState = "connecting" | "connected" | "reconnecting" | "closed";
|
|
84
|
+
export interface ArenaConnectOptions {
|
|
85
|
+
lastEventId?: string;
|
|
86
|
+
reconnect?: boolean;
|
|
87
|
+
reconnectDelayMs?: number;
|
|
88
|
+
signal?: AbortSignal;
|
|
89
|
+
onEvent?: (event: ArenaServerEvent) => void;
|
|
90
|
+
onStateChange?: (state: ArenaConnectionState) => void;
|
|
91
|
+
onError?: (error: Error) => void;
|
|
92
|
+
}
|
|
93
|
+
export interface ArenaStreamOptions extends ArenaSendOptions {
|
|
94
|
+
reconnect?: boolean;
|
|
95
|
+
reconnectDelayMs?: number;
|
|
96
|
+
cancelOnAbort?: boolean;
|
|
97
|
+
onInputRequired?: (request: ArenaInputRequest, session: ArenaSession) => Promise<ArenaAnswer[]> | ArenaAnswer[];
|
|
98
|
+
}
|
|
99
|
+
export interface ArenaTurnResult {
|
|
100
|
+
status: "success" | "error" | "unknown";
|
|
101
|
+
text: string;
|
|
102
|
+
reasoning: string;
|
|
103
|
+
messages: Message[];
|
|
104
|
+
files: Array<Record<string, unknown>>;
|
|
105
|
+
events: ArenaServerEvent[];
|
|
106
|
+
error?: string;
|
|
107
|
+
}
|
|
108
|
+
export interface ArenaRunResult extends ArenaTurnResult {
|
|
109
|
+
session: ArenaSession;
|
|
110
|
+
}
|
|
111
|
+
export declare class ArenaApiError extends Error {
|
|
112
|
+
readonly status: number;
|
|
113
|
+
readonly body: unknown;
|
|
114
|
+
constructor(message: string, status: number, body: unknown);
|
|
115
|
+
}
|
|
116
|
+
export declare function defaultArenaClientContext(): ArenaClientContext;
|
|
117
|
+
export declare class ArenaClient {
|
|
118
|
+
readonly sessions: {
|
|
119
|
+
create: (options?: ArenaCreateSessionOptions) => Promise<ArenaSession>;
|
|
120
|
+
resume: (credentials: ArenaCredentials) => ArenaSession;
|
|
121
|
+
};
|
|
122
|
+
private readonly baseUrl;
|
|
123
|
+
private readonly fetcher;
|
|
124
|
+
private readonly requestCredentials;
|
|
125
|
+
private readonly onCredentials?;
|
|
126
|
+
constructor(options?: ArenaClientOptions);
|
|
127
|
+
getConfig(signal?: AbortSignal): Promise<ArenaConfigResponse>;
|
|
128
|
+
createSession(options?: ArenaCreateSessionOptions): Promise<ArenaSession>;
|
|
129
|
+
resumeSession(credentials: ArenaCredentials): ArenaSession;
|
|
130
|
+
run(options: ArenaStreamOptions, createOptions?: ArenaCreateSessionOptions): Promise<ArenaRunResult>;
|
|
131
|
+
request(pathname: string, init?: RequestInit): Promise<Response>;
|
|
132
|
+
resolveUrl(pathname: string): string;
|
|
133
|
+
credentialsChanged(credentials: ArenaCredentials): void;
|
|
134
|
+
}
|
|
135
|
+
export declare class ArenaSession {
|
|
136
|
+
private readonly client;
|
|
137
|
+
readonly id: string;
|
|
138
|
+
lastEventId: string;
|
|
139
|
+
private tokenValue;
|
|
140
|
+
private expiresAtValue?;
|
|
141
|
+
constructor(client: ArenaClient, credentials: ArenaCredentials);
|
|
142
|
+
get credentials(): ArenaCredentials;
|
|
143
|
+
setLastEventId(value: string): void;
|
|
144
|
+
refreshToken(signal?: AbortSignal): Promise<ArenaCredentials>;
|
|
145
|
+
getHistory(signal?: AbortSignal): Promise<ArenaHistory>;
|
|
146
|
+
upload(input: ArenaUploadInput, signal?: AbortSignal): Promise<ArenaAttachment>;
|
|
147
|
+
send(options: ArenaSendOptions): Promise<ArenaSendResult>;
|
|
148
|
+
connect(options?: ArenaConnectOptions): ArenaEventStream;
|
|
149
|
+
stream(options: ArenaStreamOptions): AsyncGenerator<ArenaServerEvent>;
|
|
150
|
+
run(options: ArenaStreamOptions): Promise<ArenaTurnResult>;
|
|
151
|
+
respondToInput(requestId: string, answers: ArenaAnswer[], signal?: AbortSignal): Promise<void>;
|
|
152
|
+
cancel(signal?: AbortSignal): Promise<boolean>;
|
|
153
|
+
workspaceUrl(filePath: string): string;
|
|
154
|
+
download(filePath: string, signal?: AbortSignal): Promise<Blob>;
|
|
155
|
+
private workspacePath;
|
|
156
|
+
openEventResponse(signal: AbortSignal): Promise<Response>;
|
|
157
|
+
private authorizedRequest;
|
|
158
|
+
}
|
|
159
|
+
export declare class ArenaEventStream implements AsyncIterable<ArenaServerEvent> {
|
|
160
|
+
private readonly session;
|
|
161
|
+
private readonly options;
|
|
162
|
+
readonly ready: Promise<void>;
|
|
163
|
+
readonly closed: Promise<void>;
|
|
164
|
+
private readonly controller;
|
|
165
|
+
private readonly events;
|
|
166
|
+
private readonly reconnect;
|
|
167
|
+
private readonly reconnectDelayMs;
|
|
168
|
+
private readyResolve;
|
|
169
|
+
private readyReject;
|
|
170
|
+
private closedResolve;
|
|
171
|
+
private readySettled;
|
|
172
|
+
private connectedOnce;
|
|
173
|
+
private intentionalClose;
|
|
174
|
+
private removeExternalAbort?;
|
|
175
|
+
constructor(session: ArenaSession, options: ArenaConnectOptions);
|
|
176
|
+
close(): void;
|
|
177
|
+
[Symbol.asyncIterator](): AsyncIterator<ArenaServerEvent>;
|
|
178
|
+
private state;
|
|
179
|
+
private pump;
|
|
180
|
+
}
|
|
181
|
+
export {};
|