acp-port 0.1.1 → 0.2.0
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/CONTRIBUTING.md +6 -4
- package/README.md +12 -7
- package/dist/agent/agent.js +53 -12
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/diagnostics.d.ts +3 -0
- package/dist/agent/diagnostics.js +29 -0
- package/dist/agent/diagnostics.js.map +1 -0
- package/dist/agent/session.d.ts +7 -1
- package/dist/agent/session.js +48 -1
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/turn.js +27 -8
- package/dist/agent/turn.js.map +1 -1
- package/dist/cli/arguments.d.ts +1 -1
- package/dist/cli/arguments.js +2 -0
- package/dist/cli/arguments.js.map +1 -1
- package/dist/config/modes.d.ts +31 -0
- package/dist/config/modes.js +42 -0
- package/dist/config/modes.js.map +1 -0
- package/dist/providers/adapters/anthropic-provider.d.ts +1 -1
- package/dist/providers/adapters/anthropic-provider.js +12 -10
- package/dist/providers/adapters/anthropic-provider.js.map +1 -1
- package/dist/providers/adapters/openai-provider.d.ts +1 -1
- package/dist/providers/adapters/openai-provider.js +9 -8
- package/dist/providers/adapters/openai-provider.js.map +1 -1
- package/dist/providers/provider-contract.d.ts +6 -0
- package/dist/providers/provider-contract.js +11 -1
- package/dist/providers/provider-contract.js.map +1 -1
- package/dist/providers/provider-registry.d.ts +2 -2
- package/dist/providers/provider-registry.js +11 -7
- package/dist/providers/provider-registry.js.map +1 -1
- package/dist/providers/support/request-handling.d.ts +3 -3
- package/dist/providers/support/request-handling.js +125 -21
- package/dist/providers/support/request-handling.js.map +1 -1
- package/dist/providers/support/sdk-clients.d.ts +1 -1
- package/dist/providers/support/sdk-clients.js +17 -5
- package/dist/providers/support/sdk-clients.js.map +1 -1
- package/dist/tools/catalog.d.ts +34 -7
- package/dist/tools/catalog.js +35 -11
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/file-discovery.d.ts +12 -0
- package/dist/tools/file-discovery.js +120 -0
- package/dist/tools/file-discovery.js.map +1 -0
- package/dist/tools/local-command.d.ts +6 -0
- package/dist/tools/local-command.js +79 -0
- package/dist/tools/local-command.js.map +1 -0
- package/dist/tools/local-files.d.ts +3 -0
- package/dist/tools/local-files.js +79 -0
- package/dist/tools/local-files.js.map +1 -0
- package/dist/tools/runner.d.ts +8 -0
- package/dist/tools/runner.js +176 -21
- package/dist/tools/runner.js.map +1 -1
- package/docs/architecture.md +27 -14
- package/docs/capabilities.md +43 -15
- package/docs/configuration.md +21 -3
- package/docs/editor-integration.md +34 -9
- package/docs/providers.md +38 -1
- package/docs/releases.md +8 -6
- package/docs/troubleshooting.md +40 -4
- package/package.json +9 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modes.js","sourceRoot":"","sources":["../../src/config/modes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,QAAQ;IACR,cAAc;IACd,MAAM;IACN,MAAM;IACN,aAAa;CACd,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,qFAAqF;KACxF;IACD;QACE,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,gEAAgE;KACnE;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,WAAW,EACT,qFAAqF;KACxF;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,0FAA0F;KAC7F;IACD;QACE,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,gFAAgF;KACnF;CACoE,CAAC;AAExE,MAAM,UAAU,mBAAmB,CAAC,IAAe;IACjD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC/D,OAAO,SAAS,IAAI,KAAK,QAAQ,EAAE,WAAW,KAC5C,IAAI,KAAK,aAAa;QACpB,CAAC,CAAC,yHAAyH;QAC3H,CAAC,CAAC,oFACN,EAAE,CAAC;AACL,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ApiProviderConfig, type GenerateRequest, type Model, type ModelEvent, type Provider } from "../provider-contract.js";
|
|
2
2
|
/** Native Anthropic Messages API; does not read Claude subscription credentials. */
|
|
3
3
|
export declare class AnthropicProvider implements Provider {
|
|
4
4
|
private readonly config;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ProviderError, } from "../provider-contract.js";
|
|
1
2
|
import { createProviderRequestSignal, sanitizeProviderError, validateToolCalls, } from "../support/request-handling.js";
|
|
2
3
|
import { ConfiguredAnthropicClient } from "../support/sdk-clients.js";
|
|
3
4
|
/** Native Anthropic Messages API; does not read Claude subscription credentials. */
|
|
@@ -9,27 +10,28 @@ export class AnthropicProvider {
|
|
|
9
10
|
this.client = new ConfiguredAnthropicClient(config);
|
|
10
11
|
}
|
|
11
12
|
async listModels(signal) {
|
|
13
|
+
const requestSignal = createProviderRequestSignal(this.config, signal);
|
|
12
14
|
try {
|
|
13
15
|
const models = [];
|
|
14
|
-
for await (const model of this.client.models.list({}, { signal:
|
|
16
|
+
for await (const model of this.client.models.list({}, { signal: requestSignal })) {
|
|
15
17
|
models.push({ id: model.id, name: model.display_name });
|
|
16
18
|
}
|
|
17
19
|
return models;
|
|
18
20
|
}
|
|
19
21
|
catch (error) {
|
|
20
|
-
throw sanitizeProviderError(error);
|
|
22
|
+
throw sanitizeProviderError(error, this.config, requestSignal);
|
|
21
23
|
}
|
|
22
24
|
}
|
|
23
25
|
async *generate(request) {
|
|
26
|
+
const signal = createProviderRequestSignal(this.config, request.signal);
|
|
24
27
|
try {
|
|
25
|
-
yield* this.generateStream(request);
|
|
28
|
+
yield* this.generateStream(request, signal);
|
|
26
29
|
}
|
|
27
30
|
catch (error) {
|
|
28
|
-
throw sanitizeProviderError(error);
|
|
31
|
+
throw sanitizeProviderError(error, this.config, signal);
|
|
29
32
|
}
|
|
30
33
|
}
|
|
31
|
-
async *generateStream(request) {
|
|
32
|
-
const signal = createProviderRequestSignal(this.config, request.signal);
|
|
34
|
+
async *generateStream(request, signal) {
|
|
33
35
|
const stream = await this.client.messages.create({
|
|
34
36
|
model: request.model,
|
|
35
37
|
system: request.system,
|
|
@@ -74,7 +76,7 @@ export class AnthropicProvider {
|
|
|
74
76
|
else if (event.delta.type === "input_json_delta") {
|
|
75
77
|
const pending = calls.get(event.index);
|
|
76
78
|
if (!pending) {
|
|
77
|
-
throw new
|
|
79
|
+
throw new ProviderError("Anthropic streamed tool input without a tool call.", "protocol");
|
|
78
80
|
}
|
|
79
81
|
pending.call.arguments += event.delta.partial_json;
|
|
80
82
|
}
|
|
@@ -98,7 +100,7 @@ export class AnthropicProvider {
|
|
|
98
100
|
}
|
|
99
101
|
signal.throwIfAborted();
|
|
100
102
|
if (!completed || !stopReason) {
|
|
101
|
-
throw new
|
|
103
|
+
throw new ProviderError("Anthropic stream ended before the message completed; retry the prompt.", "protocol");
|
|
102
104
|
}
|
|
103
105
|
if (stopReason === "max_tokens" ||
|
|
104
106
|
stopReason === "model_context_window_exceeded") {
|
|
@@ -110,13 +112,13 @@ export class AnthropicProvider {
|
|
|
110
112
|
return;
|
|
111
113
|
}
|
|
112
114
|
if (stopReason === "pause_turn") {
|
|
113
|
-
throw new
|
|
115
|
+
throw new ProviderError("Anthropic paused the turn before completion; retry the prompt.", "protocol");
|
|
114
116
|
}
|
|
115
117
|
const completeCalls = [...calls.entries()]
|
|
116
118
|
.sort(([a], [b]) => a - b)
|
|
117
119
|
.map(([, pending]) => {
|
|
118
120
|
if (!pending.complete) {
|
|
119
|
-
throw new
|
|
121
|
+
throw new ProviderError("Anthropic returned an incomplete tool call.", "protocol");
|
|
120
122
|
}
|
|
121
123
|
return {
|
|
122
124
|
...pending.call,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-provider.js","sourceRoot":"","sources":["../../../src/providers/adapters/anthropic-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"anthropic-provider.js","sourceRoot":"","sources":["../../../src/providers/adapters/anthropic-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ApiProviderConfig, type GenerateRequest, type Model, type ModelEvent, type Provider } from "../provider-contract.js";
|
|
2
2
|
/** Chat Completions transport for OpenAI, local models, and LLM proxies. */
|
|
3
3
|
export declare class OpenAIProvider implements Provider {
|
|
4
4
|
private readonly config;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ProviderError, } from "../provider-contract.js";
|
|
1
2
|
import { createProviderRequestSignal, listOpenAIModels, sanitizeProviderError, validateToolCalls, } from "../support/request-handling.js";
|
|
2
3
|
import { ConfiguredOpenAIClient } from "../support/sdk-clients.js";
|
|
3
4
|
/** Chat Completions transport for OpenAI, local models, and LLM proxies. */
|
|
@@ -12,15 +13,15 @@ export class OpenAIProvider {
|
|
|
12
13
|
return listOpenAIModels(this.client, this.config, signal);
|
|
13
14
|
}
|
|
14
15
|
async *generate(request) {
|
|
16
|
+
const signal = createProviderRequestSignal(this.config, request.signal);
|
|
15
17
|
try {
|
|
16
|
-
yield* this.generateStream(request);
|
|
18
|
+
yield* this.generateStream(request, signal);
|
|
17
19
|
}
|
|
18
20
|
catch (error) {
|
|
19
|
-
throw sanitizeProviderError(error);
|
|
21
|
+
throw sanitizeProviderError(error, this.config, signal);
|
|
20
22
|
}
|
|
21
23
|
}
|
|
22
|
-
async *generateStream(request) {
|
|
23
|
-
const signal = createProviderRequestSignal(this.config, request.signal);
|
|
24
|
+
async *generateStream(request, signal) {
|
|
24
25
|
const stream = await this.client.chat.completions.create({
|
|
25
26
|
model: request.model,
|
|
26
27
|
messages: [
|
|
@@ -69,7 +70,7 @@ export class OpenAIProvider {
|
|
|
69
70
|
else {
|
|
70
71
|
const singleCallIndex = calls.keys().next().value;
|
|
71
72
|
if (calls.size !== 1 || singleCallIndex === undefined) {
|
|
72
|
-
throw new
|
|
73
|
+
throw new ProviderError("The model returned an ambiguous tool-call fragment without an index or ID.", "protocol");
|
|
73
74
|
}
|
|
74
75
|
index = singleCallIndex;
|
|
75
76
|
}
|
|
@@ -80,7 +81,7 @@ export class OpenAIProvider {
|
|
|
80
81
|
arguments: "",
|
|
81
82
|
};
|
|
82
83
|
if (call.id && delta.id && call.id !== delta.id) {
|
|
83
|
-
throw new
|
|
84
|
+
throw new ProviderError("The model changed a tool-call ID while streaming.", "protocol");
|
|
84
85
|
}
|
|
85
86
|
if (delta.id) {
|
|
86
87
|
call.id = delta.id;
|
|
@@ -110,7 +111,7 @@ export class OpenAIProvider {
|
|
|
110
111
|
}
|
|
111
112
|
signal.throwIfAborted();
|
|
112
113
|
if (!finishReason) {
|
|
113
|
-
throw new
|
|
114
|
+
throw new ProviderError("The model stream ended without a finish reason; retry the prompt.", "protocol");
|
|
114
115
|
}
|
|
115
116
|
if (finishReason === "length") {
|
|
116
117
|
yield { type: "stop", reason: "max_tokens" };
|
|
@@ -121,7 +122,7 @@ export class OpenAIProvider {
|
|
|
121
122
|
return;
|
|
122
123
|
}
|
|
123
124
|
if (finishReason !== "stop" && finishReason !== "tool_calls") {
|
|
124
|
-
throw new
|
|
125
|
+
throw new ProviderError("The model returned an unsupported finish reason. Check the server's Chat Completions compatibility.", "protocol");
|
|
125
126
|
}
|
|
126
127
|
const completeCalls = [...calls.entries()]
|
|
127
128
|
.sort(([a], [b]) => a - b)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../../src/providers/adapters/openai-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../../../src/providers/adapters/openai-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,12 @@ export interface Provider {
|
|
|
49
49
|
listModels(signal?: AbortSignal): Promise<Model[]>;
|
|
50
50
|
generate(request: GenerateRequest): AsyncIterable<ModelEvent>;
|
|
51
51
|
}
|
|
52
|
+
/** Only locally authored, safe diagnostics may be displayed in the editor. */
|
|
53
|
+
export declare class ProviderError extends Error {
|
|
54
|
+
readonly kind: "configuration" | "http" | "connection" | "timeout" | "cancelled" | "protocol" | "unknown";
|
|
55
|
+
readonly status?: number | undefined;
|
|
56
|
+
constructor(message: string, kind?: "configuration" | "http" | "connection" | "timeout" | "cancelled" | "protocol" | "unknown", status?: number | undefined);
|
|
57
|
+
}
|
|
52
58
|
export interface ApiProviderConfig {
|
|
53
59
|
type: "openai" | "anthropic" | "gemini";
|
|
54
60
|
name?: string;
|
|
@@ -1,2 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
/** Only locally authored, safe diagnostics may be displayed in the editor. */
|
|
2
|
+
export class ProviderError extends Error {
|
|
3
|
+
kind;
|
|
4
|
+
status;
|
|
5
|
+
constructor(message, kind = "unknown", status) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.kind = kind;
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.name = "ProviderError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
2
12
|
//# sourceMappingURL=provider-contract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-contract.js","sourceRoot":"","sources":["../../src/providers/provider-contract.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"provider-contract.js","sourceRoot":"","sources":["../../src/providers/provider-contract.ts"],"names":[],"mappings":"AA2CA,8EAA8E;AAC9E,MAAM,OAAO,aAAc,SAAQ,KAAK;IAG3B,IAAI;IAQJ,MAAM;IAVjB,YACE,OAAe,EACN,IAAI,GAOG,SAAS,EAChB,MAAe;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC;oBAVN,IAAI;sBAQJ,MAAM;QAGf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ApiProviderConfig, Model, Provider, ProviderFactory } from "./provider-contract.js";
|
|
1
|
+
import type { ApiProviderConfig, Model, Provider, ProviderError, ProviderFactory } from "./provider-contract.js";
|
|
2
2
|
export interface RegisteredModel extends Model {
|
|
3
3
|
providerId: string;
|
|
4
4
|
modelId: string;
|
|
@@ -11,5 +11,5 @@ export declare class ProviderRegistry {
|
|
|
11
11
|
private readonly instances;
|
|
12
12
|
constructor(configs: Record<string, ApiProviderConfig>, factory: ProviderFactory, warn?: (message: string) => void);
|
|
13
13
|
get(providerId: string): Provider;
|
|
14
|
-
discover(providerId?: string, signal?: AbortSignal): Promise<RegisteredModel[]>;
|
|
14
|
+
discover(providerId?: string, signal?: AbortSignal, onFailure?: (providerId: string, error: ProviderError) => void): Promise<RegisteredModel[]>;
|
|
15
15
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sanitizeProviderError } from "./support/request-handling.js";
|
|
1
2
|
/** A URL registration is an independent provider instance, even when types match. */
|
|
2
3
|
export class ProviderRegistry {
|
|
3
4
|
configs;
|
|
@@ -23,7 +24,7 @@ export class ProviderRegistry {
|
|
|
23
24
|
}
|
|
24
25
|
return provider;
|
|
25
26
|
}
|
|
26
|
-
async discover(providerId, signal) {
|
|
27
|
+
async discover(providerId, signal, onFailure) {
|
|
27
28
|
if (providerId && !Object.hasOwn(this.configs, providerId)) {
|
|
28
29
|
throw new Error(`Unknown provider: ${providerId}`);
|
|
29
30
|
}
|
|
@@ -31,15 +32,18 @@ export class ProviderRegistry {
|
|
|
31
32
|
const catalogs = await Promise.all(entries.map(async ([id, config]) => {
|
|
32
33
|
let discovered = [];
|
|
33
34
|
if (config.discoverModels) {
|
|
35
|
+
const discoverySignal = AbortSignal.any([
|
|
36
|
+
AbortSignal.timeout(Math.min(config.timeoutMs, 10_000)),
|
|
37
|
+
...(signal ? [signal] : []),
|
|
38
|
+
]);
|
|
34
39
|
try {
|
|
35
|
-
discovered = await this.get(id).listModels(
|
|
36
|
-
AbortSignal.timeout(Math.min(config.timeoutMs, 10_000)),
|
|
37
|
-
...(signal ? [signal] : []),
|
|
38
|
-
]));
|
|
40
|
+
discovered = await this.get(id).listModels(discoverySignal);
|
|
39
41
|
}
|
|
40
|
-
catch {
|
|
42
|
+
catch (error) {
|
|
41
43
|
signal?.throwIfAborted();
|
|
42
|
-
|
|
44
|
+
const failure = sanitizeProviderError(error, config, discoverySignal);
|
|
45
|
+
this.warn(`${id}: model discovery failed. ${failure.message} Using configured models if present.`);
|
|
46
|
+
onFailure?.(id, failure);
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
49
|
const models = new Map([...discovered, ...(config.models ?? [])].map((model) => [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/providers/provider-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/providers/provider-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ApiProviderConfig, type Model, ProviderError, type ToolCall } from "../provider-contract.js";
|
|
2
2
|
import type { ConfiguredOpenAIClient } from "./sdk-clients.js";
|
|
3
3
|
/** Covers the entire streamed body, not only connection establishment. */
|
|
4
4
|
export declare function createProviderRequestSignal(config: ApiProviderConfig, signal?: AbortSignal): AbortSignal;
|
|
5
5
|
/** Validate all calls before emitting any, so a malformed batch cannot partially execute. */
|
|
6
6
|
export declare function validateToolCalls(calls: ToolCall[], toolsEnabled?: boolean): void;
|
|
7
|
-
/**
|
|
8
|
-
export declare function sanitizeProviderError(error: unknown):
|
|
7
|
+
/** Classify known failures without copying response bodies, credentials, or prompts. */
|
|
8
|
+
export declare function sanitizeProviderError(error: unknown, config?: ApiProviderConfig, signal?: AbortSignal): ProviderError;
|
|
9
9
|
/** Discover models through the OpenAI model-list endpoint. */
|
|
10
10
|
export declare function listOpenAIModels(client: ConfiguredOpenAIClient, config: ApiProviderConfig, signal?: AbortSignal): Promise<Model[]>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2
2
|
import OpenAI from "openai";
|
|
3
|
+
import { ProviderError, } from "../provider-contract.js";
|
|
3
4
|
/** Covers the entire streamed body, not only connection establishment. */
|
|
4
5
|
export function createProviderRequestSignal(config, signal) {
|
|
5
6
|
const deadline = AbortSignal.timeout(config.timeoutMs);
|
|
@@ -8,12 +9,12 @@ export function createProviderRequestSignal(config, signal) {
|
|
|
8
9
|
/** Validate all calls before emitting any, so a malformed batch cannot partially execute. */
|
|
9
10
|
export function validateToolCalls(calls, toolsEnabled = true) {
|
|
10
11
|
if (calls.length && !toolsEnabled) {
|
|
11
|
-
throw new
|
|
12
|
+
throw new ProviderError("The provider returned tool calls while tools are disabled.", "protocol");
|
|
12
13
|
}
|
|
13
14
|
const ids = new Set();
|
|
14
15
|
for (const call of calls) {
|
|
15
16
|
if (!call.id || !call.name || ids.has(call.id)) {
|
|
16
|
-
throw new
|
|
17
|
+
throw new ProviderError("The model returned an invalid or duplicate tool call.", "protocol");
|
|
17
18
|
}
|
|
18
19
|
ids.add(call.id);
|
|
19
20
|
let argumentsValue;
|
|
@@ -21,42 +22,145 @@ export function validateToolCalls(calls, toolsEnabled = true) {
|
|
|
21
22
|
argumentsValue = JSON.parse(call.arguments);
|
|
22
23
|
}
|
|
23
24
|
catch {
|
|
24
|
-
throw new
|
|
25
|
+
throw new ProviderError("The model returned incomplete or invalid JSON for a tool call. Retry the prompt or select a model with tool support.", "protocol");
|
|
25
26
|
}
|
|
26
27
|
if (argumentsValue === null ||
|
|
27
28
|
typeof argumentsValue !== "object" ||
|
|
28
29
|
Array.isArray(argumentsValue)) {
|
|
29
|
-
throw new
|
|
30
|
+
throw new ProviderError("The model returned non-object arguments for a tool call. Retry the prompt or select a model with tool support.", "protocol");
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
|
-
/**
|
|
34
|
-
export function sanitizeProviderError(error) {
|
|
34
|
+
/** Classify known failures without copying response bodies, credentials, or prompts. */
|
|
35
|
+
export function sanitizeProviderError(error, config, signal) {
|
|
36
|
+
if (error instanceof ProviderError) {
|
|
37
|
+
return error;
|
|
38
|
+
}
|
|
39
|
+
if ((signal?.aborted && signal.reason?.name === "TimeoutError") ||
|
|
40
|
+
(error instanceof Error && error.name === "TimeoutError") ||
|
|
41
|
+
error instanceof OpenAI.APIConnectionTimeoutError ||
|
|
42
|
+
error instanceof Anthropic.APIConnectionTimeoutError) {
|
|
43
|
+
return new ProviderError("Provider request timed out. Check that the model is loaded, shorten the prompt, or retry with a faster model.", "timeout");
|
|
44
|
+
}
|
|
45
|
+
if (signal?.aborted ||
|
|
46
|
+
error instanceof OpenAI.APIUserAbortError ||
|
|
47
|
+
error instanceof Anthropic.APIUserAbortError) {
|
|
48
|
+
return new ProviderError("Provider request aborted.", "cancelled");
|
|
49
|
+
}
|
|
35
50
|
if (error instanceof OpenAI.APIError || error instanceof Anthropic.APIError) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
51
|
+
const status = error.status;
|
|
52
|
+
const prefix = status
|
|
53
|
+
? `Provider request failed (HTTP ${status}).`
|
|
54
|
+
: "Provider stream failed.";
|
|
55
|
+
const diagnostic = knownResponseDiagnostic(error.error);
|
|
56
|
+
if (diagnostic) {
|
|
57
|
+
return new ProviderError(`${prefix} ${diagnostic}`, status ? "http" : "protocol", status);
|
|
58
|
+
}
|
|
59
|
+
if (status) {
|
|
60
|
+
let hint;
|
|
61
|
+
switch (status) {
|
|
62
|
+
case 401:
|
|
63
|
+
hint = `Authentication failed. Check ${config?.apiKeyEnv ?? "API_KEY"} in the editor's agent environment.`;
|
|
64
|
+
break;
|
|
65
|
+
case 403:
|
|
66
|
+
hint =
|
|
67
|
+
"Access was denied. Check the API key's permissions for this endpoint and model.";
|
|
68
|
+
break;
|
|
69
|
+
case 404:
|
|
70
|
+
hint =
|
|
71
|
+
"The endpoint or model was not found. Check --base-url and the selected model; llama.cpp's OpenAI API base URL normally ends in /v1.";
|
|
72
|
+
break;
|
|
73
|
+
case 400:
|
|
74
|
+
case 422:
|
|
75
|
+
hint =
|
|
76
|
+
"The server rejected the request. Check the model and its chat template/tool support. For llama.cpp, enable --jinja for tools or use --no-tools for text-only chat.";
|
|
77
|
+
break;
|
|
78
|
+
case 408:
|
|
79
|
+
case 504:
|
|
80
|
+
hint =
|
|
81
|
+
"The server timed out. Check that the model is loaded and retry.";
|
|
82
|
+
break;
|
|
83
|
+
case 413:
|
|
84
|
+
hint =
|
|
85
|
+
"The request is too large. Start a new session or shorten the prompt.";
|
|
86
|
+
break;
|
|
87
|
+
case 429:
|
|
88
|
+
hint =
|
|
89
|
+
"The provider is rate limited or out of quota. Wait and retry, or check the account's limits.";
|
|
90
|
+
break;
|
|
91
|
+
case 503:
|
|
92
|
+
hint =
|
|
93
|
+
"The server is unavailable or the model is still loading. Wait for it to become ready and retry.";
|
|
94
|
+
break;
|
|
95
|
+
default:
|
|
96
|
+
hint =
|
|
97
|
+
status >= 500
|
|
98
|
+
? "The server could not complete the request. Check its logs and loaded model, then retry."
|
|
99
|
+
: "Check the endpoint configuration and server logs.";
|
|
100
|
+
}
|
|
101
|
+
return new ProviderError(`${prefix} ${hint}`, "http", status);
|
|
39
102
|
}
|
|
40
|
-
if (error instanceof OpenAI.
|
|
41
|
-
error instanceof Anthropic.
|
|
42
|
-
return new
|
|
103
|
+
if (error instanceof OpenAI.APIConnectionError ||
|
|
104
|
+
error instanceof Anthropic.APIConnectionError) {
|
|
105
|
+
return new ProviderError("Could not connect to the provider. Check --base-url, the server's host/port, and network access from the process running the editor's agent.", "connection");
|
|
43
106
|
}
|
|
44
|
-
return new
|
|
45
|
-
? `Provider request failed (HTTP ${error.status}).`
|
|
46
|
-
: "Provider connection or stream failed.");
|
|
107
|
+
return new ProviderError("The provider stream failed. Check the server logs and its API compatibility, then retry.", "protocol");
|
|
47
108
|
}
|
|
48
|
-
|
|
109
|
+
if (error instanceof SyntaxError) {
|
|
110
|
+
return new ProviderError("The provider returned invalid JSON. Check that --base-url points to the API and that the server supports the selected provider protocol.", "protocol");
|
|
111
|
+
}
|
|
112
|
+
return new ProviderError("Provider request failed. Check the endpoint configuration and server logs, then retry.");
|
|
113
|
+
}
|
|
114
|
+
/** Match known error categories, never include the matched server text in output. */
|
|
115
|
+
function knownResponseDiagnostic(body) {
|
|
116
|
+
if (!body || typeof body !== "object") {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
const value = body;
|
|
120
|
+
// Anthropic errors may retain the outer error envelope.
|
|
121
|
+
const nested = value.error;
|
|
122
|
+
if (nested && typeof nested === "object") {
|
|
123
|
+
return knownResponseDiagnostic(nested);
|
|
124
|
+
}
|
|
125
|
+
const message = typeof value.message === "string" ? value.message.toLowerCase() : "";
|
|
126
|
+
const code = typeof value.code === "string" ? value.code : value.type;
|
|
127
|
+
if (/tools?(_choice)? param requires --jinja flag/.test(message)) {
|
|
128
|
+
return "llama.cpp requires --jinja for tool calling. Restart llama-server with --jinja and a tool-compatible model/template, or use --no-tools for text-only chat.";
|
|
129
|
+
}
|
|
130
|
+
if (message.includes("jinja") || /chat[_ ]template/.test(message)) {
|
|
131
|
+
return "The server could not apply the model's chat template. Check that the template supports the conversation and tools; for llama.cpp use --jinja with a tool-compatible template, or --no-tools for text-only chat.";
|
|
132
|
+
}
|
|
133
|
+
if (code === "context_length_exceeded" ||
|
|
134
|
+
code === "exceed_context_size_error" ||
|
|
135
|
+
/(?:exceeds|larger than).{0,80}context (?:size|length|window)/.test(message)) {
|
|
136
|
+
return "The conversation exceeds the model's context size. Start a new session, shorten the prompt, or increase the server's context size.";
|
|
137
|
+
}
|
|
138
|
+
if (code === "model_not_found") {
|
|
139
|
+
return "The selected model was not found. Load it on the server and select the model ID reported by the server.";
|
|
140
|
+
}
|
|
141
|
+
return undefined;
|
|
49
142
|
}
|
|
50
143
|
/** Discover models through the OpenAI model-list endpoint. */
|
|
51
144
|
export async function listOpenAIModels(client, config, signal) {
|
|
145
|
+
const requestSignal = createProviderRequestSignal(config, signal);
|
|
52
146
|
try {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
147
|
+
// SDK pagination turns a missing data field (including an HTML UI response)
|
|
148
|
+
// into an empty catalog. Validate the actual payload before that fallback.
|
|
149
|
+
const response = await client.models
|
|
150
|
+
.list({ signal: requestSignal })
|
|
151
|
+
.asResponse();
|
|
152
|
+
const body = await response.json();
|
|
153
|
+
const data = body && typeof body === "object" && "data" in body
|
|
154
|
+
? body.data
|
|
155
|
+
: undefined;
|
|
156
|
+
if (!Array.isArray(data) ||
|
|
157
|
+
data.some((model) => !model || typeof model.id !== "string" || !model.id)) {
|
|
158
|
+
throw new ProviderError("The provider returned an invalid model list. Check that --base-url points to the OpenAI-compatible API; for llama.cpp it normally ends in /v1.", "protocol");
|
|
159
|
+
}
|
|
160
|
+
return data.map((model) => ({ id: model.id, name: model.id }));
|
|
57
161
|
}
|
|
58
162
|
catch (error) {
|
|
59
|
-
throw sanitizeProviderError(error);
|
|
163
|
+
throw sanitizeProviderError(error, config, requestSignal);
|
|
60
164
|
}
|
|
61
165
|
}
|
|
62
166
|
//# sourceMappingURL=request-handling.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-handling.js","sourceRoot":"","sources":["../../../src/providers/support/request-handling.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"request-handling.js","sourceRoot":"","sources":["../../../src/providers/support/request-handling.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2
2
|
import OpenAI from "openai";
|
|
3
|
-
import type
|
|
3
|
+
import { type ApiProviderConfig } from "../provider-contract.js";
|
|
4
4
|
/** Explicit configuration prevents SDK environment defaults leaking to another endpoint. */
|
|
5
5
|
export declare class ConfiguredOpenAIClient extends OpenAI {
|
|
6
6
|
constructor(config: ApiProviderConfig);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2
2
|
import OpenAI from "openai";
|
|
3
|
+
import { ProviderError } from "../provider-contract.js";
|
|
3
4
|
function readApiKey(config) {
|
|
4
5
|
const variable = config.apiKeyEnv ?? "API_KEY";
|
|
5
6
|
const value = process.env[variable];
|
|
@@ -7,10 +8,22 @@ function readApiKey(config) {
|
|
|
7
8
|
if (!config.apiKeyEnv) {
|
|
8
9
|
return undefined;
|
|
9
10
|
}
|
|
10
|
-
throw new
|
|
11
|
+
throw new ProviderError(`Set the ${variable} environment variable for this provider.`, "configuration");
|
|
11
12
|
}
|
|
12
13
|
return value;
|
|
13
14
|
}
|
|
15
|
+
/** Both SDKs merge ambient custom headers; discard them before any request. */
|
|
16
|
+
function isolateDefaultHeaders(client, headers) {
|
|
17
|
+
// Anthropic 0.135 hides this bag from its public types. Guard the runtime
|
|
18
|
+
// shape so a future SDK change fails closed instead of forwarding headers.
|
|
19
|
+
const options = Reflect.get(client, "_options");
|
|
20
|
+
if (!options ||
|
|
21
|
+
typeof options !== "object" ||
|
|
22
|
+
!Object.hasOwn(options, "defaultHeaders") ||
|
|
23
|
+
!Reflect.set(options, "defaultHeaders", headers)) {
|
|
24
|
+
throw new ProviderError("Unable to isolate provider headers. Check the installed SDK's compatibility.", "configuration");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
14
27
|
/** Explicit configuration prevents SDK environment defaults leaking to another endpoint. */
|
|
15
28
|
export class ConfiguredOpenAIClient extends OpenAI {
|
|
16
29
|
constructor(config) {
|
|
@@ -32,8 +45,7 @@ export class ConfiguredOpenAIClient extends OpenAI {
|
|
|
32
45
|
maxRetries: 0,
|
|
33
46
|
logLevel: "off",
|
|
34
47
|
});
|
|
35
|
-
|
|
36
|
-
this._options.defaultHeaders = defaultHeaders;
|
|
48
|
+
isolateDefaultHeaders(this, defaultHeaders);
|
|
37
49
|
}
|
|
38
50
|
}
|
|
39
51
|
export class ConfiguredAnthropicClient extends Anthropic {
|
|
@@ -51,9 +63,9 @@ export class ConfiguredAnthropicClient extends Anthropic {
|
|
|
51
63
|
timeout: config.timeoutMs,
|
|
52
64
|
maxRetries: 0,
|
|
53
65
|
logLevel: "off",
|
|
66
|
+
openTelemetry: false,
|
|
54
67
|
});
|
|
55
|
-
|
|
56
|
-
this._options.defaultHeaders = defaultHeaders;
|
|
68
|
+
isolateDefaultHeaders(this, defaultHeaders);
|
|
57
69
|
}
|
|
58
70
|
}
|
|
59
71
|
//# sourceMappingURL=sdk-clients.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-clients.js","sourceRoot":"","sources":["../../../src/providers/support/sdk-clients.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,MAAM,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"sdk-clients.js","sourceRoot":"","sources":["../../../src/providers/support/sdk-clients.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAA0B,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEhF,SAAS,UAAU,CAAC,MAAyB;IAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,aAAa,CACrB,WAAW,QAAQ,0CAA0C,EAC7D,eAAe,CAChB,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+EAA+E;AAC/E,SAAS,qBAAqB,CAC5B,MAAc,EACd,OAAsC;IAEtC,0EAA0E;IAC1E,2EAA2E;IAC3E,MAAM,OAAO,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzD,IACE,CAAC,OAAO;QACR,OAAO,OAAO,KAAK,QAAQ;QAC3B,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC;QACzC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAChD,CAAC;QACD,MAAM,IAAI,aAAa,CACrB,8EAA8E,EAC9E,eAAe,CAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,MAAM,OAAO,sBAAuB,SAAQ,MAAM;IAChD,YAAY,MAAyB;QACnC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,cAAc,GAAG;YACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;YAC1C,GAAG,MAAM,CAAC,OAAO;SAClB,CAAC;QACF,KAAK,CAAC;YACJ,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,0EAA0E;YAC1E,uEAAuE;YACvE,MAAM,EAAE,MAAM,IAAI,qBAAqB;YACvC,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE,IAAI;YACb,cAAc;YACd,OAAO,EAAE,MAAM,CAAC,SAAS;YACzB,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QACH,qBAAqB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,SAAS;IACtD,YAAY,MAAyB;QACnC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,cAAc,GAAG;YACrB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YACxC,GAAG,MAAM,CAAC,OAAO;SAClB,CAAC;QACF,KAAK,CAAC;YACJ,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,IAAI,qBAAqB;YACvC,SAAS,EAAE,IAAI;YACf,cAAc;YACd,OAAO,EAAE,MAAM,CAAC,SAAS;YACzB,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,KAAK;YACf,aAAa,EAAE,KAAK;SACrB,CAAC,CAAC;QACH,qBAAqB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC9C,CAAC;CACF"}
|