agent-accelerator 0.1.0 → 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/README.md +83 -112
- package/{SYSTEM_PROMPT_AGENT.md → examples/prompts/SYSTEM_PROMPT_AGENT.md} +1 -1
- package/package.json +14 -9
- package/src/agent/agent.ts +191 -71
- package/src/agent/context.ts +1 -0
- package/src/agent/delegation.ts +61 -12
- package/src/agent/loop.ts +71 -48
- package/src/data/README.md +6 -6
- package/src/index.ts +130 -45
- package/src/models/catalog-cache.ts +60 -9
- package/src/models/catalog.ts +53 -7
- package/src/providers/google.ts +926 -0
- package/src/providers/openai-compat.ts +1147 -0
- package/src/providers/openai.ts +959 -0
- package/src/providers/openrouter-responses.ts +949 -0
- package/src/providers/openrouter.ts +1037 -0
- package/src/{ai-sdk → providers}/registry.ts +43 -55
- package/src/providers.ts +490 -0
- package/src/streaming/sse-parser.ts +6 -4
- package/src/tools/executor.ts +19 -6
- package/src/tools/schema.ts +21 -11
- package/src/types/agent.ts +8 -1
- package/src/types/core.ts +1 -1
- package/src/types/message.ts +5 -0
- package/src/types/model.ts +3 -7
- package/src/types/provider-payloads.ts +2 -84
- package/src/types/tool.ts +6 -0
- package/src/update-models.ts +56 -0
- package/src/utils/cache.ts +1 -1
- package/src/utils/documents.ts +517 -0
- package/src/utils/env.ts +0 -7
- package/src/{ai-sdk → utils}/errors.ts +61 -2
- package/src/utils/headers.ts +10 -20
- package/src/utils/media.ts +5 -2
- package/src/utils/retry.ts +89 -0
- package/src/utils/serialization.ts +15 -0
- package/src/ai-sdk/converters.ts +0 -342
- package/src/ai-sdk/executor.ts +0 -454
- package/src/ai-sdk/index.ts +0 -55
- package/src/ai-sdk/model-provider.ts +0 -303
- package/src/ai-sdk/options.ts +0 -306
- package/src/ai-sdk/provider.ts +0 -415
- package/src/tokens/counter.ts +0 -136
- /package/{SYSTEM_PROMPT.md → examples/prompts/SYSTEM_PROMPT.md} +0 -0
- /package/{SYSTEM_PROMPT_TOOLS.md → examples/prompts/SYSTEM_PROMPT_TOOLS.md} +0 -0
|
@@ -1,33 +1,30 @@
|
|
|
1
1
|
import type { Provider, ProviderId, ModelSpec } from "../types/model.ts";
|
|
2
2
|
import type { ThinkingLevel } from "../types/core.ts";
|
|
3
|
-
import {
|
|
4
|
-
GoogleAiSdkProvider,
|
|
5
|
-
OpenCodeAiSdkProvider,
|
|
6
|
-
OpenRouterAiSdkProvider,
|
|
7
|
-
OpenAiAiSdkProvider,
|
|
8
|
-
CustomAiSdkProvider,
|
|
9
|
-
} from "./model-provider.ts";
|
|
3
|
+
import { OpenAICompatibleChatProvider } from "./openai-compat.ts";
|
|
10
4
|
import { getModelFromCatalog } from "../models/catalog.ts";
|
|
11
5
|
import { getEnv } from "../utils/env.ts";
|
|
6
|
+
import { GoogleInteractionsProvider } from "./google.ts";
|
|
7
|
+
import { OpenRouterChatCompletionsProvider } from "./openrouter.ts";
|
|
8
|
+
import { OpenAIResponsesProvider } from "./openai.ts";
|
|
12
9
|
|
|
13
10
|
const providerRegistry = new Map<ProviderId, Provider>();
|
|
14
11
|
|
|
15
|
-
//
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
12
|
+
// Google + OpenAI + OpenRouter are served by dedicated native REST adapters
|
|
13
|
+
// (`./google.ts` Interactions, `./openai.ts` Responses, `./openrouter.ts`
|
|
14
|
+
// Chat Completions). Any other prefix is served by the generic native
|
|
15
|
+
// OpenAI-compatible Chat Completions adapter (`./openai-compat.ts`).
|
|
16
|
+
const googleProvider = new GoogleInteractionsProvider();
|
|
17
|
+
const openrouterProvider = new OpenRouterChatCompletionsProvider();
|
|
18
|
+
const openaiProvider = new OpenAIResponsesProvider();
|
|
20
19
|
|
|
21
20
|
providerRegistry.set("google", googleProvider);
|
|
22
21
|
providerRegistry.set("gemini", googleProvider);
|
|
23
|
-
providerRegistry.set("opencode", opencodeProvider);
|
|
24
|
-
providerRegistry.set("opencode-go", opencodeProvider);
|
|
25
22
|
providerRegistry.set("openrouter", openrouterProvider);
|
|
26
23
|
providerRegistry.set("openai", openaiProvider);
|
|
27
24
|
|
|
28
25
|
// ---------------------------------------------------------------------------
|
|
29
|
-
// Unified multi-provider layer
|
|
30
|
-
// Any `MODEL="<prefix>/<model-id>"` works without
|
|
26
|
+
// Unified multi-provider layer (all native REST, no SDK transport)
|
|
27
|
+
// Any `MODEL="<prefix>/<model-id>"` works without code changes as long as
|
|
31
28
|
// `{PREFIX}_API_KEY` (+ optional `{PREFIX}_BASE_URL`) is set. Examples:
|
|
32
29
|
// MODEL="groq/llama-3.3-70b-versatile" + GROQ_API_KEY + GROQ_BASE_URL
|
|
33
30
|
// MODEL="cerebras/gpt-oss-120b" + CEREBRAS_API_KEY + CEREBRAS_BASE_URL
|
|
@@ -36,12 +33,30 @@ providerRegistry.set("openai", openaiProvider);
|
|
|
36
33
|
const FIRST_CLASS = new Set([
|
|
37
34
|
"google",
|
|
38
35
|
"gemini",
|
|
39
|
-
"opencode",
|
|
40
|
-
"opencode-go",
|
|
41
36
|
"openrouter",
|
|
42
37
|
"openai",
|
|
43
38
|
]);
|
|
44
39
|
|
|
40
|
+
// Removed providers: fail loudly instead of misrouting. OpenCode free models
|
|
41
|
+
// are harness-only since 2026, so the opencode/opencode-go prefixes no longer
|
|
42
|
+
// resolve anywhere.
|
|
43
|
+
const REMOVED_PROVIDERS = new Set(["opencode", "opencode-go"]);
|
|
44
|
+
|
|
45
|
+
function removedProviderMessage(id: string): string {
|
|
46
|
+
return (
|
|
47
|
+
`[Agent Accelerator] Provider "${id}" has been removed: OpenCode free models are ` +
|
|
48
|
+
`harness-only and are no longer served over the API. Use google, openai, openrouter, or any ` +
|
|
49
|
+
`OpenAI-compatible endpoint ({PREFIX}_API_KEY + {PREFIX}_BASE_URL) instead.`
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Throws for removed provider prefixes. */
|
|
54
|
+
function assertProviderNotRemoved(id: string): void {
|
|
55
|
+
if (REMOVED_PROVIDERS.has(id.trim().toLowerCase())) {
|
|
56
|
+
throw new Error(removedProviderMessage(id.trim()));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
45
60
|
/**
|
|
46
61
|
* Normalizes a provider prefix for registry lookup and environment resolution.
|
|
47
62
|
* @example `const prefix = normalizeProviderPrefix(" Groq/llama ");`
|
|
@@ -51,7 +66,7 @@ export function normalizeProviderPrefix(prefix: string): string {
|
|
|
51
66
|
}
|
|
52
67
|
|
|
53
68
|
/**
|
|
54
|
-
*
|
|
69
|
+
* Registers or retrieves a native OpenAI-compatible provider for any custom prefix.
|
|
55
70
|
* Cached, so repeated `resolveModel("groq/...")` calls reuse one instance.
|
|
56
71
|
*/
|
|
57
72
|
/**
|
|
@@ -63,20 +78,21 @@ export function ensureCustomProvider(
|
|
|
63
78
|
prefix: string,
|
|
64
79
|
opts?: { baseUrl?: string; apiKey?: string; name?: string }
|
|
65
80
|
): Provider {
|
|
81
|
+
assertProviderNotRemoved(prefix);
|
|
66
82
|
const id = normalizeProviderPrefix(prefix) as ProviderId;
|
|
67
83
|
const existing = providerRegistry.get(id);
|
|
68
84
|
if (existing && !FIRST_CLASS.has(id.toLowerCase())) return existing;
|
|
69
85
|
if (existing && opts?.baseUrl === undefined && opts?.apiKey === undefined) {
|
|
70
86
|
return existing;
|
|
71
87
|
}
|
|
72
|
-
const created = new
|
|
88
|
+
const created = new OpenAICompatibleChatProvider(id, opts);
|
|
73
89
|
providerRegistry.set(id, created);
|
|
74
90
|
return created;
|
|
75
91
|
}
|
|
76
92
|
|
|
77
93
|
/**
|
|
78
94
|
* Retrieves a provider by ID.
|
|
79
|
-
* Unknown ids auto-create
|
|
95
|
+
* Unknown ids auto-create a native OpenAI-compatible provider (unified layer),
|
|
80
96
|
* so `getProvider("groq")` works after setting `GROQ_API_KEY`/`GROQ_BASE_URL`.
|
|
81
97
|
*/
|
|
82
98
|
/**
|
|
@@ -86,14 +102,15 @@ export function ensureCustomProvider(
|
|
|
86
102
|
*/
|
|
87
103
|
export function getProvider(id: ProviderId | string): Provider {
|
|
88
104
|
const key = String(id).trim() as ProviderId;
|
|
105
|
+
assertProviderNotRemoved(key);
|
|
89
106
|
const provider = providerRegistry.get(key);
|
|
90
107
|
if (provider) return provider;
|
|
91
108
|
if (!key) {
|
|
92
109
|
throw new Error(
|
|
93
|
-
`Provider '' is not supported or not registered. Available first-support providers: google,
|
|
110
|
+
`Provider '' is not supported or not registered. Available first-support providers: google, openrouter, openai — or any custom prefix via {PREFIX}_API_KEY + {PREFIX}_BASE_URL.`
|
|
94
111
|
);
|
|
95
112
|
}
|
|
96
|
-
// Unified layer: lazily create OpenAI-compatible provider for any custom prefix.
|
|
113
|
+
// Unified layer: lazily create a native OpenAI-compatible provider for any custom prefix.
|
|
97
114
|
return ensureCustomProvider(key);
|
|
98
115
|
}
|
|
99
116
|
|
|
@@ -105,8 +122,8 @@ export interface ResolvedModel {
|
|
|
105
122
|
}
|
|
106
123
|
|
|
107
124
|
/**
|
|
108
|
-
* Resolves a model string (e.g. "google/model-id", "
|
|
109
|
-
* or ModelSpec into provider instance and model ID
|
|
125
|
+
* Resolves a model string (e.g. "google/model-id", "openai/gpt-4o", "openrouter/scope/model:variant")
|
|
126
|
+
* or ModelSpec into provider instance and model ID.
|
|
110
127
|
*/
|
|
111
128
|
/**
|
|
112
129
|
* Resolves `provider/model`, catalog specs, scoped OpenRouter IDs, and custom prefixes.
|
|
@@ -149,6 +166,7 @@ export function resolveModel(model: string | ModelSpec): ResolvedModel {
|
|
|
149
166
|
const parts = modelStr.split("/");
|
|
150
167
|
const providerPrefix = parts[0]!.toLowerCase();
|
|
151
168
|
const remainingModel = parts.slice(1).join("/");
|
|
169
|
+
assertProviderNotRemoved(providerPrefix);
|
|
152
170
|
|
|
153
171
|
// 1. Explicit openai/ prefix ALWAYS routes to OpenAI provider
|
|
154
172
|
if (providerPrefix === "openai") {
|
|
@@ -164,8 +182,6 @@ export function resolveModel(model: string | ModelSpec): ResolvedModel {
|
|
|
164
182
|
const isExplicitOther = [
|
|
165
183
|
"google",
|
|
166
184
|
"gemini",
|
|
167
|
-
"opencode",
|
|
168
|
-
"opencode-go",
|
|
169
185
|
"openrouter",
|
|
170
186
|
].includes(providerPrefix);
|
|
171
187
|
|
|
@@ -208,18 +224,6 @@ export function resolveModel(model: string | ModelSpec): ResolvedModel {
|
|
|
208
224
|
return { provider: p, modelId: remainingModel, modelSpec: spec as ModelSpec };
|
|
209
225
|
}
|
|
210
226
|
|
|
211
|
-
if (
|
|
212
|
-
providerPrefix === "opencode" ||
|
|
213
|
-
providerPrefix === "opencode-go"
|
|
214
|
-
) {
|
|
215
|
-
const p = getProvider("opencode");
|
|
216
|
-
const spec =
|
|
217
|
-
p.getModel(remainingModel) ||
|
|
218
|
-
getModelFromCatalog("opencode", remainingModel) ||
|
|
219
|
-
getModelFromCatalog(remainingModel, remainingModel);
|
|
220
|
-
return { provider: p, modelId: remainingModel, modelSpec: spec as ModelSpec };
|
|
221
|
-
}
|
|
222
|
-
|
|
223
227
|
if (providerPrefix === "openrouter") {
|
|
224
228
|
const p = getProvider("openrouter");
|
|
225
229
|
const spec =
|
|
@@ -249,7 +253,6 @@ export function resolveModel(model: string | ModelSpec): ResolvedModel {
|
|
|
249
253
|
const prioritizedUnknown =
|
|
250
254
|
tryCatalogLookup(providerPrefix, remainingModel) ||
|
|
251
255
|
tryCatalogLookup("google", remainingModel) ||
|
|
252
|
-
tryCatalogLookup("opencode", remainingModel) ||
|
|
253
256
|
tryCatalogLookup("openai", remainingModel) ||
|
|
254
257
|
tryCatalogLookup("openrouter", remainingModel) ||
|
|
255
258
|
getModelFromCatalog(modelStr, modelStr);
|
|
@@ -283,7 +286,6 @@ export function resolveModel(model: string | ModelSpec): ResolvedModel {
|
|
|
283
286
|
// No slash — try catalog with internal provider priority
|
|
284
287
|
const prioritized =
|
|
285
288
|
tryCatalogLookup("google", modelStr) ||
|
|
286
|
-
tryCatalogLookup("opencode", modelStr) ||
|
|
287
289
|
tryCatalogLookup("openai", modelStr) ||
|
|
288
290
|
tryCatalogLookup("openrouter", modelStr) ||
|
|
289
291
|
getModelFromCatalog(modelStr, modelStr);
|
|
@@ -335,20 +337,6 @@ export const ModelProvider = {
|
|
|
335
337
|
};
|
|
336
338
|
},
|
|
337
339
|
|
|
338
|
-
/** Builds an OpenCode model selection. @example `ModelProvider.OpenCode("kimi-k2.5")` */
|
|
339
|
-
OpenCode(
|
|
340
|
-
model: string,
|
|
341
|
-
apiKey?: string,
|
|
342
|
-
options?: { thinkingLevel?: ThinkingLevel; baseUrl?: string }
|
|
343
|
-
): ModelProviderInstance {
|
|
344
|
-
return {
|
|
345
|
-
model: model.startsWith("opencode") ? model : `opencode/${model}`,
|
|
346
|
-
apiKey,
|
|
347
|
-
baseUrl: options?.baseUrl,
|
|
348
|
-
thinkingLevel: options?.thinkingLevel,
|
|
349
|
-
};
|
|
350
|
-
},
|
|
351
|
-
|
|
352
340
|
/** Builds an OpenRouter model selection. @example `ModelProvider.OpenRouter("openai/gpt-4o")` */
|
|
353
341
|
OpenRouter(
|
|
354
342
|
model: string,
|