@andreprado/agentkit 0.1.0-alpha.17 → 0.1.0-alpha.19

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 (64) hide show
  1. package/README.md +3 -0
  2. package/docs/guides/add-channel.md +14 -8
  3. package/docs/guides/add-knowledge.md +10 -0
  4. package/docs/guides/add-managed-composio.md +43 -17
  5. package/docs/guides/channel-security.md +60 -39
  6. package/docs/guides/connect-discord.md +178 -0
  7. package/docs/guides/create-agent.md +13 -0
  8. package/docs/guides/debug-channel.md +147 -0
  9. package/docs/guides/improve-from-production.md +151 -0
  10. package/docs/guides/prepare-deploy.md +30 -14
  11. package/docs/guides/replay-production-traces.md +72 -0
  12. package/docs/guides/run-evals.md +18 -0
  13. package/docs/guides/security-rules.md +5 -5
  14. package/docs/guides/use-provider.md +11 -1
  15. package/docs/llms-full.txt +106 -15
  16. package/docs/llms.txt +22 -4
  17. package/package.json +1 -3
  18. package/src/cli/args.ts +23 -2
  19. package/src/cli/cloud-client.ts +75 -0
  20. package/src/cli/commands/channels.ts +139 -14
  21. package/src/cli/deploy-chat-ui.ts +146 -3
  22. package/src/cli/deploy-readiness.ts +57 -1
  23. package/src/cli/help.ts +32 -8
  24. package/src/cli/index.ts +447 -17
  25. package/src/create-project.ts +13 -2
  26. package/src/index.ts +46 -3
  27. package/src/providers/pi.ts +49 -15
  28. package/src/runtime/channel-test-harness.ts +4 -1
  29. package/src/runtime/channels/discord.ts +887 -0
  30. package/src/runtime/channels.ts +15 -0
  31. package/src/runtime/config.ts +39 -3
  32. package/src/runtime/core/manifest.ts +2 -0
  33. package/src/runtime/dev-server.ts +149 -8
  34. package/src/runtime/evals.ts +27 -6
  35. package/src/runtime/improve.ts +868 -0
  36. package/src/runtime/inspect.ts +1 -0
  37. package/src/runtime/integrations/composio.ts +168 -2
  38. package/src/runtime/knowledge/retrieve.ts +25 -5
  39. package/src/runtime/knowledge/schema.ts +45 -1
  40. package/src/runtime/runtime-contract.ts +54 -0
  41. package/src/runtime/targets/cloudflare/build.ts +479 -194
  42. package/src/runtime/targets/vps/deploy.ts +1 -1
  43. package/src/storage/sqlite.ts +7 -2
  44. package/src/templates/skills/agentkit-capsule/SKILL.md +8 -1
  45. package/src/templates/skills/agentkit-capsule/references/docs-router.md +1 -2
  46. package/src/templates/skills/agentkit-channels/SKILL.md +6 -1
  47. package/src/templates/skills/agentkit-channels/references/channel-debugging.md +2 -1
  48. package/src/templates/skills/agentkit-channels/references/discord.md +93 -0
  49. package/src/templates/skills/agentkit-deploy/SKILL.md +6 -0
  50. package/src/templates/skills/agentkit-evals/SKILL.md +12 -3
  51. package/src/templates/skills/agentkit-improve/SKILL.md +86 -0
  52. package/src/templates/skills/agentkit-improve/references/replay-side-effects.md +18 -0
  53. package/src/templates/skills/agentkit-improve/references/trace-packets.md +22 -0
  54. package/src/templates/skills/agentkit-improve/templates/regression.eval.md +18 -0
  55. package/src/templates/skills/agentkit-integrations/SKILL.md +12 -2
  56. package/src/templates/skills/agentkit-knowledge/SKILL.md +4 -1
  57. package/src/templates/skills/agentkit-provider/SKILL.md +4 -1
  58. package/src/templates/skills/agentkit-security/SKILL.md +3 -2
  59. package/src/templates/skills/agentkit-troubleshooting/SKILL.md +9 -0
  60. package/src/templates/support.ts +4 -2
  61. package/docs/guides/agentkit-skills-architecture.md +0 -472
  62. package/docs/guides/channels-implementation-map.md +0 -243
  63. package/docs/guides/channels-production-handoff.md +0 -118
  64. package/docs/portable-deploy-release-checklist.md +0 -41
package/src/index.ts CHANGED
@@ -2,9 +2,10 @@ export type AgentRuntime = "local" | "edge";
2
2
  export type AgentProviderName = "test" | "openai" | "anthropic" | "openrouter" | "custom";
3
3
  export type AccessMode = "private" | "token" | "public";
4
4
  export type ToolVisibility = "user" | "internal";
5
- export type ChannelType = "website" | "telegram" | "whatsapp";
6
- export type ChannelProvider = "agentkit" | "telegram" | "zapster" | "meta";
5
+ export type ChannelType = "website" | "telegram" | "whatsapp" | "discord";
6
+ export type ChannelProvider = "agentkit" | "telegram" | "zapster" | "meta" | "discord";
7
7
  export type WhatsappChannelProvider = "zapster" | "meta";
8
+ export type DiscordChannelMode = "interactions" | "bot";
8
9
  export type TelegramAllowedUpdate = "message";
9
10
  export type ChannelAudioMode = "off" | "reject" | "transcribe";
10
11
  export type TranscriptionProviderName = "test" | "openai" | "groq";
@@ -143,7 +144,26 @@ export type WhatsappChannelConfig = {
143
144
  audio?: ChannelAudioConfig;
144
145
  };
145
146
 
146
- export type AgentChannel = WebsiteChannelConfig | TelegramChannelConfig | WhatsappChannelConfig;
147
+ export type DiscordChannelInput = {
148
+ name: string;
149
+ mode?: DiscordChannelMode;
150
+ secrets?: string[];
151
+ limits?: ChannelLimits;
152
+ buffer?: ChannelBufferInput;
153
+ };
154
+
155
+ export type DiscordChannelConfig = {
156
+ type: "discord";
157
+ provider: "discord";
158
+ name: string;
159
+ mode: DiscordChannelMode;
160
+ secrets: string[];
161
+ limits?: ChannelLimits;
162
+ buffer?: ChannelBufferConfig;
163
+ audio?: never;
164
+ };
165
+
166
+ export type AgentChannel = WebsiteChannelConfig | TelegramChannelConfig | WhatsappChannelConfig | DiscordChannelConfig;
147
167
 
148
168
  export type IntegrationTagsConfig = {
149
169
  enable?: string[];
@@ -155,6 +175,7 @@ export type ComposioManagedIntegrationInput = {
155
175
  toolkits: string[];
156
176
  tools?: Record<string, string[]>;
157
177
  tags?: IntegrationTagsConfig;
178
+ confirmExternalWrites?: boolean;
158
179
  };
159
180
 
160
181
  export type ComposioManagedIntegration = {
@@ -165,6 +186,7 @@ export type ComposioManagedIntegration = {
165
186
  toolkits: string[];
166
187
  tools?: Record<string, string[]>;
167
188
  tags?: IntegrationTagsConfig;
189
+ confirmExternalWrites?: boolean;
168
190
  };
169
191
 
170
192
  export type AgentIntegration = ComposioManagedIntegration;
@@ -368,6 +390,7 @@ export function composioManaged(input: ComposioManagedIntegrationInput): Composi
368
390
  const toolkits = normalizeToolkitList(input.toolkits, "composioManaged.toolkits");
369
391
  const tools = input.tools ? normalizeComposioToolMap(input.tools, toolkits) : undefined;
370
392
  const tags = input.tags ? normalizeIntegrationTags(input.tags) : undefined;
393
+ const confirmExternalWrites = input.confirmExternalWrites;
371
394
 
372
395
  return {
373
396
  type: "composio",
@@ -377,6 +400,7 @@ export function composioManaged(input: ComposioManagedIntegrationInput): Composi
377
400
  toolkits,
378
401
  ...(tools ? { tools } : {}),
379
402
  ...(tags ? { tags } : {}),
403
+ ...(confirmExternalWrites === undefined ? {} : { confirmExternalWrites }),
380
404
  };
381
405
  }
382
406
 
@@ -424,6 +448,24 @@ export function whatsappChannel(input: WhatsappChannelInput): WhatsappChannelCon
424
448
  };
425
449
  }
426
450
 
451
+ export function discordChannel(input: DiscordChannelInput): DiscordChannelConfig {
452
+ const mode = input.mode ?? "interactions";
453
+
454
+ return {
455
+ type: "discord",
456
+ provider: "discord",
457
+ name: input.name,
458
+ mode,
459
+ secrets: normalizeChannelSecrets(input.secrets ?? defaultDiscordChannelSecrets(mode), "discord channel"),
460
+ ...(input.limits ? { limits: input.limits } : {}),
461
+ ...(input.buffer ? { buffer: normalizeChannelBuffer(input.buffer, "discord channel") } : {}),
462
+ };
463
+ }
464
+
465
+ function defaultDiscordChannelSecrets(mode: DiscordChannelMode): string[] {
466
+ return mode === "bot" ? ["DISCORD_BOT_TOKEN"] : ["DISCORD_PUBLIC_KEY"];
467
+ }
468
+
427
469
  function defaultWhatsappChannelSecrets(provider: WhatsappChannelProvider): string[] {
428
470
  if (provider === "zapster") {
429
471
  return ["ZAPSTER_API_KEY", "ZAPSTER_INSTANCE_ID", "ZAPSTER_WEBHOOK_ID"];
@@ -645,6 +687,7 @@ export type {
645
687
  ChannelMediaDownloadResult,
646
688
  ChannelMessageContentType,
647
689
  ChannelMessageRole,
690
+ ChannelReplyTarget,
648
691
  ChannelSendInput,
649
692
  ChannelSendResult,
650
693
  ChannelStatusInput,
@@ -19,6 +19,9 @@ import type { ProviderAdapter, ProviderRunInput, ProviderRunResult } from "./typ
19
19
 
20
20
  const PI_PROVIDER_NAMES = ["openai", "anthropic", "openrouter"] as const satisfies AgentProviderName[];
21
21
  const MAX_TOOL_TURNS = 8;
22
+ const OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
23
+ const UNKNOWN_OPENROUTER_CONTEXT_WINDOW = 128000;
24
+ const UNKNOWN_OPENROUTER_MAX_TOKENS = 8192;
22
25
 
23
26
  export const piProviderAdapters: ProviderAdapter[] = PI_PROVIDER_NAMES.map((name) => ({
24
27
  name,
@@ -189,25 +192,56 @@ function formatSecretList(names: string[]): string {
189
192
  return `one of: ${names.join(", ")}`;
190
193
  }
191
194
 
192
- function resolveModel(provider: Provider, modelId: string): Model<any> {
193
- const modelExists = getModels(provider as any).some((model) => model.id === modelId);
195
+ export function resolveModel(provider: Provider, modelId: string): Model<any> {
196
+ const model = getModel(provider as any, modelId as any) as Model<any> | undefined;
194
197
 
195
- if (!modelExists) {
196
- throw new AgentKitError(
197
- "provider_model_unsupported",
198
- `Pi SDK could not resolve provider "${provider}" model "${modelId}".`,
199
- );
198
+ if (model) {
199
+ return model;
200
200
  }
201
201
 
202
- try {
203
- return getModel(provider as any, modelId as any) as Model<any>;
204
- } catch (error) {
205
- throw new AgentKitError(
206
- "provider_model_unsupported",
207
- `Pi SDK could not resolve provider "${provider}" model "${modelId}".`,
208
- { cause: error },
209
- );
202
+ if (provider === "openrouter") {
203
+ return createOpenRouterPassThroughModel(modelId);
210
204
  }
205
+
206
+ throw new AgentKitError(
207
+ "provider_model_unsupported",
208
+ `Pi SDK could not resolve provider "${provider}" model "${modelId}". ${knownModelHint(provider)}`,
209
+ );
210
+ }
211
+
212
+ function createOpenRouterPassThroughModel(modelId: string): Model<"openai-completions"> {
213
+ return {
214
+ id: modelId,
215
+ name: `OpenRouter ${modelId}`,
216
+ api: "openai-completions",
217
+ provider: "openrouter",
218
+ baseUrl: OPENROUTER_BASE_URL,
219
+ reasoning: false,
220
+ input: ["text"],
221
+ cost: {
222
+ input: 0,
223
+ output: 0,
224
+ cacheRead: 0,
225
+ cacheWrite: 0,
226
+ },
227
+ contextWindow: UNKNOWN_OPENROUTER_CONTEXT_WINDOW,
228
+ maxTokens: UNKNOWN_OPENROUTER_MAX_TOKENS,
229
+ compat: {
230
+ openRouterRouting: {},
231
+ },
232
+ };
233
+ }
234
+
235
+ function knownModelHint(provider: Provider): string {
236
+ const examples = getModels(provider as any)
237
+ .slice(0, 5)
238
+ .map((model) => model.id);
239
+
240
+ if (examples.length === 0) {
241
+ return "Use a model id supported by the installed Pi SDK for that provider.";
242
+ }
243
+
244
+ return `Use a model id supported by the installed Pi SDK for that provider. Examples: ${examples.join(", ")}.`;
211
245
  }
212
246
 
213
247
  function toPiMessages(messages: ProviderRunInput["messages"]): Message[] {
@@ -14,7 +14,10 @@ export type ChannelFixtureName =
14
14
  | "zapster-message"
15
15
  | "zapster-audio-message"
16
16
  | "zapster-duplicate-message"
17
- | "zapster-unsupported-media";
17
+ | "zapster-unsupported-media"
18
+ | "discord-command"
19
+ | "discord-message-create"
20
+ | "discord-ping";
18
21
 
19
22
  export type ChannelFixture = {
20
23
  name: ChannelFixtureName;