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.
Files changed (45) hide show
  1. package/README.md +83 -112
  2. package/{SYSTEM_PROMPT_AGENT.md → examples/prompts/SYSTEM_PROMPT_AGENT.md} +1 -1
  3. package/package.json +14 -9
  4. package/src/agent/agent.ts +191 -71
  5. package/src/agent/context.ts +1 -0
  6. package/src/agent/delegation.ts +61 -12
  7. package/src/agent/loop.ts +71 -48
  8. package/src/data/README.md +6 -6
  9. package/src/index.ts +130 -45
  10. package/src/models/catalog-cache.ts +60 -9
  11. package/src/models/catalog.ts +53 -7
  12. package/src/providers/google.ts +926 -0
  13. package/src/providers/openai-compat.ts +1147 -0
  14. package/src/providers/openai.ts +959 -0
  15. package/src/providers/openrouter-responses.ts +949 -0
  16. package/src/providers/openrouter.ts +1037 -0
  17. package/src/{ai-sdk → providers}/registry.ts +43 -55
  18. package/src/providers.ts +490 -0
  19. package/src/streaming/sse-parser.ts +6 -4
  20. package/src/tools/executor.ts +19 -6
  21. package/src/tools/schema.ts +21 -11
  22. package/src/types/agent.ts +8 -1
  23. package/src/types/core.ts +1 -1
  24. package/src/types/message.ts +5 -0
  25. package/src/types/model.ts +3 -7
  26. package/src/types/provider-payloads.ts +2 -84
  27. package/src/types/tool.ts +6 -0
  28. package/src/update-models.ts +56 -0
  29. package/src/utils/cache.ts +1 -1
  30. package/src/utils/documents.ts +517 -0
  31. package/src/utils/env.ts +0 -7
  32. package/src/{ai-sdk → utils}/errors.ts +61 -2
  33. package/src/utils/headers.ts +10 -20
  34. package/src/utils/media.ts +5 -2
  35. package/src/utils/retry.ts +89 -0
  36. package/src/utils/serialization.ts +15 -0
  37. package/src/ai-sdk/converters.ts +0 -342
  38. package/src/ai-sdk/executor.ts +0 -454
  39. package/src/ai-sdk/index.ts +0 -55
  40. package/src/ai-sdk/model-provider.ts +0 -303
  41. package/src/ai-sdk/options.ts +0 -306
  42. package/src/ai-sdk/provider.ts +0 -415
  43. package/src/tokens/counter.ts +0 -136
  44. /package/{SYSTEM_PROMPT.md → examples/prompts/SYSTEM_PROMPT.md} +0 -0
  45. /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
- // Initialize default supported providers powered purely by Vercel AI SDK
16
- const googleProvider = new GoogleAiSdkProvider();
17
- const opencodeProvider = new OpenCodeAiSdkProvider();
18
- const openrouterProvider = new OpenRouterAiSdkProvider();
19
- const openaiProvider = new OpenAiAiSdkProvider();
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 powered purely by Vercel AI SDK
30
- // Any `MODEL="<prefix>/<model-id>"` works without SDK changes as long as
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
- * Get-or-create an OpenAI-compatible provider for any prefix backed by Vercel AI SDK.
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 CustomAiSdkProvider(id, opts);
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 an OpenAI-compatible provider (unified layer),
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, opencode, openrouter, openai — or any custom prefix via {PREFIX}_API_KEY + {PREFIX}_BASE_URL.`
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", "opencode/model-id", "openrouter/scope/model:variant")
109
- * or ModelSpec into provider instance and model ID using Vercel AI SDK provider layer.
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,