@xenosystem/acp 0.2.0 → 0.2.2
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/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/openai.d.ts +29 -6
- package/dist/openai.d.ts.map +1 -1
- package/dist/openai.js +34 -6
- package/dist/openai.js.map +1 -1
- package/package.json +17 -32
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -18,7 +18,7 @@ import { buildServer } from "./server.js";
|
|
|
18
18
|
// starting one (importing this module must have no side effects).
|
|
19
19
|
export { buildServer } from "./server.js";
|
|
20
20
|
const log = createLogger("server");
|
|
21
|
-
export const VERSION = "0.2.
|
|
21
|
+
export const VERSION = "0.2.2";
|
|
22
22
|
function usage() {
|
|
23
23
|
return [
|
|
24
24
|
`xeno-acp ${VERSION} — OpenAI-compatible ACP gateway`,
|
package/dist/openai.d.ts
CHANGED
|
@@ -33,10 +33,17 @@ export interface ChatCompletionRequest {
|
|
|
33
33
|
max_tokens?: number;
|
|
34
34
|
user?: string;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* ⚠️ EVERY FIELD IS OPTIONAL, because a count we were not given is not a count of zero.
|
|
38
|
+
*
|
|
39
|
+
* An absent field means the agent did not report it. A present `0` means it really did report
|
|
40
|
+
* zero — which is a legitimate reading at the start of a session. Collapsing the two is the defect
|
|
41
|
+
* this whole signal keeps rediscovering.
|
|
42
|
+
*/
|
|
36
43
|
export interface Usage {
|
|
37
|
-
prompt_tokens
|
|
38
|
-
completion_tokens
|
|
39
|
-
total_tokens
|
|
44
|
+
prompt_tokens?: number;
|
|
45
|
+
completion_tokens?: number;
|
|
46
|
+
total_tokens?: number;
|
|
40
47
|
}
|
|
41
48
|
export declare function makeCompletionId(): string;
|
|
42
49
|
/** Unix seconds. (Plain Node runtime — Date is available here.) */
|
|
@@ -48,14 +55,30 @@ export interface CompletionParts {
|
|
|
48
55
|
created: number;
|
|
49
56
|
model: string;
|
|
50
57
|
}
|
|
51
|
-
export declare function buildCompletion(parts: CompletionParts, text: string, finishReason: string, usage: Usage): unknown;
|
|
58
|
+
export declare function buildCompletion(parts: CompletionParts, text: string, finishReason: string, usage: Usage | undefined): unknown;
|
|
52
59
|
export declare function buildChunk(parts: CompletionParts, delta: Record<string, unknown>, finishReason: string | null): unknown;
|
|
53
60
|
export declare function sse(data: unknown): string;
|
|
54
61
|
export declare const SSE_DONE = "data: [DONE]\n\n";
|
|
55
|
-
/**
|
|
62
|
+
/**
|
|
63
|
+
* The usage object for a completion — or `undefined` when the agent reported nothing.
|
|
64
|
+
*
|
|
65
|
+
* 🔴 THIS USED TO MANUFACTURE `prompt_tokens: 0`, and the client that believes it is OURS.
|
|
66
|
+
* `xeno-agent-sdk`'s `usageValues()` treats a numeric `prompt_tokens` as a genuine provider
|
|
67
|
+
* reading, so a synthesised zero became `usageReported: true` with `contextTokens: 0` — rendering
|
|
68
|
+
* **`0 / 200.0K context (about 0%)`**, which is what a genuinely empty context looks like. That is
|
|
69
|
+
* the exact render `usageReported` was added to the SDK to remove, arriving over the wire from a
|
|
70
|
+
* XENO surface instead.
|
|
71
|
+
*
|
|
72
|
+
* ⚠️ The gateway is deliberately “the same shape as xeno-rt so clients can swap base URLs”, so an
|
|
73
|
+
* SDK pointed here is an intended configuration, not a hypothetical. Both halves are ours and each
|
|
74
|
+
* looked locally correct: the gateway filled a required field, the SDK trusted a reported number.
|
|
75
|
+
*
|
|
76
|
+
* ⚠️ Reported fields are carried INDIVIDUALLY. An agent that reports completion but not prompt
|
|
77
|
+
* gets a usage object with one field, not a zero standing in for the other.
|
|
78
|
+
*/
|
|
56
79
|
export declare function usageFrom(u: {
|
|
57
80
|
prompt?: number;
|
|
58
81
|
completion?: number;
|
|
59
82
|
total?: number;
|
|
60
|
-
} | undefined): Usage;
|
|
83
|
+
} | undefined): Usage | undefined;
|
|
61
84
|
//# sourceMappingURL=openai.d.ts.map
|
package/dist/openai.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,IAAI,GACJ,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC;IAC7D,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,IAAI,CAAC,EAAE,aAAa,CAAC;IAErB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,KAAK;IACpB,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,IAAI,GACJ,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC;IAC7D,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,IAAI,CAAC,EAAE,aAAa,CAAC;IAErB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,MAAM,WAAW,KAAK;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,mEAAmE;AACnE,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAYD,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,WAAW,EAAE,CAS1E;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,KAAK,GAAG,SAAS,GACvB,OAAO,CAgBT;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,OAAO,CAQT;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEzC;AAED,eAAO,MAAM,QAAQ,qBAAqB,CAAC;AAE3C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CACvB,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GACtE,KAAK,GAAG,SAAS,CAenB"}
|
package/dist/openai.js
CHANGED
|
@@ -48,7 +48,8 @@ export function buildCompletion(parts, text, finishReason, usage) {
|
|
|
48
48
|
finish_reason: finishReason,
|
|
49
49
|
},
|
|
50
50
|
],
|
|
51
|
-
|
|
51
|
+
// Omitted entirely when nothing was reported — absence is the honest signal.
|
|
52
|
+
...(usage === undefined ? {} : { usage }),
|
|
52
53
|
};
|
|
53
54
|
}
|
|
54
55
|
export function buildChunk(parts, delta, finishReason) {
|
|
@@ -64,11 +65,38 @@ export function sse(data) {
|
|
|
64
65
|
return `data: ${JSON.stringify(data)}\n\n`;
|
|
65
66
|
}
|
|
66
67
|
export const SSE_DONE = "data: [DONE]\n\n";
|
|
67
|
-
/**
|
|
68
|
+
/**
|
|
69
|
+
* The usage object for a completion — or `undefined` when the agent reported nothing.
|
|
70
|
+
*
|
|
71
|
+
* 🔴 THIS USED TO MANUFACTURE `prompt_tokens: 0`, and the client that believes it is OURS.
|
|
72
|
+
* `xeno-agent-sdk`'s `usageValues()` treats a numeric `prompt_tokens` as a genuine provider
|
|
73
|
+
* reading, so a synthesised zero became `usageReported: true` with `contextTokens: 0` — rendering
|
|
74
|
+
* **`0 / 200.0K context (about 0%)`**, which is what a genuinely empty context looks like. That is
|
|
75
|
+
* the exact render `usageReported` was added to the SDK to remove, arriving over the wire from a
|
|
76
|
+
* XENO surface instead.
|
|
77
|
+
*
|
|
78
|
+
* ⚠️ The gateway is deliberately “the same shape as xeno-rt so clients can swap base URLs”, so an
|
|
79
|
+
* SDK pointed here is an intended configuration, not a hypothetical. Both halves are ours and each
|
|
80
|
+
* looked locally correct: the gateway filled a required field, the SDK trusted a reported number.
|
|
81
|
+
*
|
|
82
|
+
* ⚠️ Reported fields are carried INDIVIDUALLY. An agent that reports completion but not prompt
|
|
83
|
+
* gets a usage object with one field, not a zero standing in for the other.
|
|
84
|
+
*/
|
|
68
85
|
export function usageFrom(u) {
|
|
69
|
-
const
|
|
70
|
-
const
|
|
71
|
-
const
|
|
72
|
-
|
|
86
|
+
const reported = (value) => typeof value === "number" && Number.isFinite(value);
|
|
87
|
+
const prompt = reported(u?.prompt) ? u?.prompt : undefined;
|
|
88
|
+
const completion = reported(u?.completion) ? u?.completion : undefined;
|
|
89
|
+
// A total is reported, or derivable only when BOTH parts are known. Deriving it from one part
|
|
90
|
+
// would report a partial figure as the whole.
|
|
91
|
+
const total = reported(u?.total)
|
|
92
|
+
? u?.total
|
|
93
|
+
: prompt !== undefined && completion !== undefined ? prompt + completion : undefined;
|
|
94
|
+
if (prompt === undefined && completion === undefined && total === undefined)
|
|
95
|
+
return undefined;
|
|
96
|
+
return {
|
|
97
|
+
...(prompt === undefined ? {} : { prompt_tokens: prompt }),
|
|
98
|
+
...(completion === undefined ? {} : { completion_tokens: completion }),
|
|
99
|
+
...(total === undefined ? {} : { total_tokens: total }),
|
|
100
|
+
};
|
|
73
101
|
}
|
|
74
102
|
//# sourceMappingURL=openai.js.map
|
package/dist/openai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,57 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xenosystem/acp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "OpenAI-compatible HTTP gateway for xeno-acp: drive any ACP agent via /v1/chat/completions.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
9
|
"bin": {
|
|
10
|
-
"xeno-acp": "
|
|
10
|
+
"xeno-acp": "dist/index.js"
|
|
11
11
|
},
|
|
12
|
-
"files": [
|
|
13
|
-
"dist",
|
|
14
|
-
"README.md",
|
|
15
|
-
"LICENSE",
|
|
16
|
-
"NOTICE",
|
|
17
|
-
"xeno-acp.config.example.jsonc"
|
|
18
|
-
],
|
|
12
|
+
"files": ["dist", "README.md", "LICENSE", "NOTICE", "xeno-acp.config.example.jsonc"],
|
|
19
13
|
"engines": {
|
|
20
14
|
"node": ">=20"
|
|
21
15
|
},
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
|
|
16
|
+
"scripts": {
|
|
17
|
+
"dev": "tsx watch src/index.ts",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"build": "tsc -p tsconfig.json",
|
|
20
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
21
|
+
"prepack": "pnpm run build",
|
|
22
|
+
"clean": "rimraf dist *.tsbuildinfo"
|
|
23
|
+
},
|
|
24
|
+
"keywords": ["acp", "agent-client-protocol", "openai-compatible", "ai-gateway", "xeno"],
|
|
29
25
|
"homepage": "https://xenostudio.ai/product/acp",
|
|
30
26
|
"repository": {
|
|
31
27
|
"type": "git",
|
|
32
28
|
"url": "git+https://github.com/XENO-CORPORATION/xeno-acp.git",
|
|
33
29
|
"directory": "packages/server"
|
|
34
30
|
},
|
|
35
|
-
"bugs": {
|
|
36
|
-
|
|
37
|
-
},
|
|
38
|
-
"publishConfig": {
|
|
39
|
-
"access": "public"
|
|
40
|
-
},
|
|
31
|
+
"bugs": { "url": "https://github.com/XENO-CORPORATION/xeno-acp/issues" },
|
|
32
|
+
"publishConfig": { "access": "public" },
|
|
41
33
|
"dependencies": {
|
|
42
|
-
"
|
|
43
|
-
"
|
|
34
|
+
"@xenosystem/acp-core": "workspace:^",
|
|
35
|
+
"fastify": "^5.1.0"
|
|
44
36
|
},
|
|
45
37
|
"devDependencies": {
|
|
46
38
|
"@types/node": "^22.9.0",
|
|
47
39
|
"tsx": "^4.19.2",
|
|
48
40
|
"typescript": "^5.6.3"
|
|
49
|
-
},
|
|
50
|
-
"scripts": {
|
|
51
|
-
"dev": "tsx watch src/index.ts",
|
|
52
|
-
"start": "node dist/index.js",
|
|
53
|
-
"build": "tsc -p tsconfig.json",
|
|
54
|
-
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
55
|
-
"clean": "rimraf dist *.tsbuildinfo"
|
|
56
41
|
}
|
|
57
|
-
}
|
|
42
|
+
}
|