@andreprado/agentkit 0.1.0-alpha.5 → 0.1.0-alpha.6
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 +5 -0
- package/docs/guides/add-channel.md +25 -0
- package/docs/guides/add-knowledge.md +134 -0
- package/docs/guides/agentkit-skills-architecture.md +471 -0
- package/docs/guides/channels-production-handoff.md +2 -0
- package/docs/guides/connect-telegram.md +15 -0
- package/docs/guides/connect-whatsapp-zapster.md +16 -0
- package/docs/guides/create-agent.md +1 -1
- package/docs/llms-full.txt +90 -1
- package/docs/llms.txt +9 -2
- package/package.json +2 -1
- package/src/cli/commands/channels.ts +39 -1
- package/src/cli/commands/knowledge.ts +136 -0
- package/src/cli/deploy-readiness.ts +19 -0
- package/src/cli/help.ts +8 -0
- package/src/cli/index.ts +16 -4
- package/src/cloud/artifact.ts +92 -1
- package/src/cloud/contracts.ts +16 -0
- package/src/create-project.ts +38 -6
- package/src/index.ts +98 -0
- package/src/runtime/channel-buffer.ts +30 -0
- package/src/runtime/channels.ts +1 -0
- package/src/runtime/chat.ts +21 -2
- package/src/runtime/config.ts +167 -0
- package/src/runtime/core/manifest.ts +37 -0
- package/src/runtime/deploy-readiness.ts +12 -0
- package/src/runtime/dev-server.ts +159 -10
- package/src/runtime/inspect.ts +34 -0
- package/src/runtime/knowledge/chunk.ts +333 -0
- package/src/runtime/knowledge/config.ts +135 -0
- package/src/runtime/knowledge/embeddings.ts +133 -0
- package/src/runtime/knowledge/ingest.ts +521 -0
- package/src/runtime/knowledge/prompt-policy.ts +30 -0
- package/src/runtime/knowledge/retrieve.ts +283 -0
- package/src/runtime/knowledge/schema.ts +56 -0
- package/src/runtime/knowledge/tool.ts +64 -0
- package/src/runtime/knowledge/vector.ts +258 -0
- package/src/runtime/targets/cloudflare/build.ts +469 -4
- package/src/storage/sqlite.ts +5 -0
- package/src/templates/blank.ts +8 -4
- package/src/templates/dentista.ts +3 -1
- package/src/templates/skills/agentkit-build-agent/SKILL.md +49 -0
- package/src/templates/skills/agentkit-build-agent/templates/appointment-intake.instructions.md +20 -0
- package/src/templates/skills/agentkit-build-agent/templates/sales-qualifier.instructions.md +17 -0
- package/src/templates/skills/agentkit-build-agent/templates/support-agent.instructions.md +16 -0
- package/src/templates/skills/agentkit-capsule/SKILL.md +62 -0
- package/src/templates/skills/agentkit-capsule/references/docs-router.md +15 -0
- package/src/templates/skills/agentkit-channels/SKILL.md +62 -0
- package/src/templates/skills/agentkit-channels/references/channel-buffering.md +58 -0
- package/src/templates/skills/agentkit-channels/references/channel-debugging.md +37 -0
- package/src/templates/skills/agentkit-channels/references/telegram.md +37 -0
- package/src/templates/skills/agentkit-channels/references/whatsapp-zapster.md +37 -0
- package/src/templates/skills/agentkit-database/SKILL.md +42 -0
- package/src/templates/skills/agentkit-database/templates/appointments.schema.sql +15 -0
- package/src/templates/skills/agentkit-database/templates/leads.schema.sql +17 -0
- package/src/templates/skills/agentkit-deploy/SKILL.md +44 -0
- package/src/templates/skills/agentkit-evals/SKILL.md +31 -0
- package/src/templates/skills/agentkit-evals/templates/no-leak.eval.md +14 -0
- package/src/templates/skills/agentkit-evals/templates/smoke.eval.md +14 -0
- package/src/templates/skills/agentkit-evals/templates/tool-call.eval.md +18 -0
- package/src/templates/skills/agentkit-knowledge/SKILL.md +40 -0
- package/src/templates/skills/agentkit-knowledge/templates/faq.md +14 -0
- package/src/templates/skills/agentkit-knowledge/templates/policies.md +14 -0
- package/src/templates/skills/agentkit-knowledge/templates/prices.csv +3 -0
- package/src/templates/skills/agentkit-prompts/SKILL.md +45 -0
- package/src/templates/skills/agentkit-prompts/templates/knowledge-grounded-faq.instructions.md +11 -0
- package/src/templates/skills/agentkit-provider/SKILL.md +57 -0
- package/src/templates/skills/agentkit-security/SKILL.md +55 -0
- package/src/templates/skills/agentkit-tools/SKILL.md +36 -0
- package/src/templates/skills/agentkit-tools/examples/database-write.tool.md +35 -0
- package/src/templates/skills/agentkit-tools/examples/eval-safe-external-action.tool.md +37 -0
- package/src/templates/skills/agentkit-tools/examples/lookup-order.tool.md +46 -0
- package/src/templates/skills/agentkit-troubleshooting/SKILL.md +52 -0
- package/src/templates/support.ts +8 -4
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AgentConfig,
|
|
3
|
+
AgentKnowledgeConfig,
|
|
4
|
+
AgentKnowledgeEmbeddingProvider,
|
|
5
|
+
AgentKnowledgeSource,
|
|
6
|
+
} from "../../index";
|
|
7
|
+
|
|
8
|
+
export type ResolvedKnowledgeSource =
|
|
9
|
+
| {
|
|
10
|
+
kind: "file";
|
|
11
|
+
value: string;
|
|
12
|
+
title: string | null;
|
|
13
|
+
}
|
|
14
|
+
| {
|
|
15
|
+
kind: "url";
|
|
16
|
+
value: string;
|
|
17
|
+
title: string | null;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type ResolvedKnowledgeConfig = {
|
|
21
|
+
enabled: boolean;
|
|
22
|
+
sources: ResolvedKnowledgeSource[];
|
|
23
|
+
embedding: {
|
|
24
|
+
provider: AgentKnowledgeEmbeddingProvider;
|
|
25
|
+
model: string | null;
|
|
26
|
+
dimensions: number | null;
|
|
27
|
+
secret: string | null;
|
|
28
|
+
};
|
|
29
|
+
retrieval: {
|
|
30
|
+
topK: number;
|
|
31
|
+
hybrid: boolean;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const DEFAULT_TOP_K = 8;
|
|
36
|
+
const DEFAULT_TEST_EMBEDDING_DIMENSIONS = 32;
|
|
37
|
+
const DEFAULT_OPENAI_EMBEDDING_MODEL = "text-embedding-3-small";
|
|
38
|
+
const DEFAULT_OPENAI_EMBEDDING_DIMENSIONS = 1536;
|
|
39
|
+
|
|
40
|
+
export function resolveKnowledgeConfig(config: Pick<AgentConfig, "knowledge">): ResolvedKnowledgeConfig {
|
|
41
|
+
const knowledge = config.knowledge;
|
|
42
|
+
|
|
43
|
+
if (!knowledge) {
|
|
44
|
+
return {
|
|
45
|
+
enabled: false,
|
|
46
|
+
sources: [],
|
|
47
|
+
embedding: {
|
|
48
|
+
provider: "none",
|
|
49
|
+
model: null,
|
|
50
|
+
dimensions: null,
|
|
51
|
+
secret: null,
|
|
52
|
+
},
|
|
53
|
+
retrieval: {
|
|
54
|
+
topK: DEFAULT_TOP_K,
|
|
55
|
+
hybrid: false,
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const provider = knowledge.embedding?.provider ?? "none";
|
|
61
|
+
const embedding = resolveEmbeddingConfig(provider, knowledge);
|
|
62
|
+
const hybrid = knowledge.retrieval?.hybrid ?? provider !== "none";
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
enabled: true,
|
|
66
|
+
sources: (knowledge.sources ?? []).map(resolveKnowledgeSource),
|
|
67
|
+
embedding,
|
|
68
|
+
retrieval: {
|
|
69
|
+
topK: knowledge.retrieval?.topK ?? DEFAULT_TOP_K,
|
|
70
|
+
hybrid,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function resolveEmbeddingConfig(
|
|
76
|
+
provider: AgentKnowledgeEmbeddingProvider,
|
|
77
|
+
knowledge: AgentKnowledgeConfig,
|
|
78
|
+
): ResolvedKnowledgeConfig["embedding"] {
|
|
79
|
+
if (provider === "openai") {
|
|
80
|
+
return {
|
|
81
|
+
provider,
|
|
82
|
+
model: knowledge.embedding?.model ?? DEFAULT_OPENAI_EMBEDDING_MODEL,
|
|
83
|
+
dimensions: knowledge.embedding?.dimensions ?? DEFAULT_OPENAI_EMBEDDING_DIMENSIONS,
|
|
84
|
+
secret: knowledge.embedding?.secret ?? "OPENAI_API_KEY",
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (provider === "test") {
|
|
89
|
+
return {
|
|
90
|
+
provider,
|
|
91
|
+
model: knowledge.embedding?.model ?? "fake",
|
|
92
|
+
dimensions: knowledge.embedding?.dimensions ?? DEFAULT_TEST_EMBEDDING_DIMENSIONS,
|
|
93
|
+
secret: knowledge.embedding?.secret ?? null,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
provider: "none",
|
|
99
|
+
model: knowledge.embedding?.model ?? null,
|
|
100
|
+
dimensions: knowledge.embedding?.dimensions ?? null,
|
|
101
|
+
secret: knowledge.embedding?.secret ?? null,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function resolveKnowledgeSource(source: AgentKnowledgeSource): ResolvedKnowledgeSource {
|
|
106
|
+
if (typeof source === "string") {
|
|
107
|
+
if (/^https?:\/\//i.test(source)) {
|
|
108
|
+
return {
|
|
109
|
+
kind: "url",
|
|
110
|
+
value: source,
|
|
111
|
+
title: null,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return {
|
|
116
|
+
kind: "file",
|
|
117
|
+
value: source,
|
|
118
|
+
title: null,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if ("url" in source) {
|
|
123
|
+
return {
|
|
124
|
+
kind: "url",
|
|
125
|
+
value: source.url,
|
|
126
|
+
title: source.title ?? null,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return {
|
|
131
|
+
kind: "file",
|
|
132
|
+
value: source.path,
|
|
133
|
+
title: source.title ?? null,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
import type { ResolvedKnowledgeConfig } from "./config";
|
|
4
|
+
import { AgentKitError } from "../errors";
|
|
5
|
+
|
|
6
|
+
export type EmbeddingProvider = {
|
|
7
|
+
embed(input: string): Promise<number[]>;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type CreateEmbeddingProviderOptions = {
|
|
11
|
+
config: ResolvedKnowledgeConfig["embedding"];
|
|
12
|
+
env?: Record<string, string | undefined>;
|
|
13
|
+
fetch?: typeof fetch;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export function createEmbeddingProvider(options: CreateEmbeddingProviderOptions): EmbeddingProvider | null {
|
|
17
|
+
if (options.config.provider === "none") {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (options.config.provider === "test") {
|
|
22
|
+
return {
|
|
23
|
+
async embed(input) {
|
|
24
|
+
return fakeEmbedding(input, options.config.dimensions ?? 32);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (options.config.provider === "openai") {
|
|
30
|
+
return {
|
|
31
|
+
async embed(input) {
|
|
32
|
+
return openAiEmbedding(input, options);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
throw new AgentKitError("knowledge_embedding_provider_unsupported", "Unsupported knowledge embedding provider.");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function fakeEmbedding(input: string, dimensions: number): number[] {
|
|
41
|
+
const values = Array.from({ length: dimensions }, () => 0);
|
|
42
|
+
const tokens = input.toLowerCase().match(/[\p{L}\p{N}_-]+/gu) ?? [];
|
|
43
|
+
|
|
44
|
+
for (const token of tokens) {
|
|
45
|
+
const hash = createHash("sha256").update(token).digest();
|
|
46
|
+
const index = hash[0] % dimensions;
|
|
47
|
+
const sign = hash[1] % 2 === 0 ? 1 : -1;
|
|
48
|
+
const weight = 1 + (hash[2] % 7) / 10;
|
|
49
|
+
values[index] += sign * weight;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return normalizeVector(values);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function cosineSimilarity(left: number[], right: number[]): number {
|
|
56
|
+
if (left.length !== right.length || left.length === 0) {
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
let dot = 0;
|
|
61
|
+
let leftNorm = 0;
|
|
62
|
+
let rightNorm = 0;
|
|
63
|
+
|
|
64
|
+
for (let index = 0; index < left.length; index += 1) {
|
|
65
|
+
dot += left[index] * right[index];
|
|
66
|
+
leftNorm += left[index] * left[index];
|
|
67
|
+
rightNorm += right[index] * right[index];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (leftNorm === 0 || rightNorm === 0) {
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function openAiEmbedding(input: string, options: CreateEmbeddingProviderOptions): Promise<number[]> {
|
|
78
|
+
const secretName = options.config.secret ?? "OPENAI_API_KEY";
|
|
79
|
+
const apiKey = options.env?.[secretName] ?? process.env[secretName];
|
|
80
|
+
|
|
81
|
+
if (!apiKey) {
|
|
82
|
+
throw new AgentKitError(
|
|
83
|
+
"knowledge_embedding_secret_missing",
|
|
84
|
+
`Knowledge embeddings require missing secret "${secretName}". Set it in .env or the process environment.`,
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const fetchImpl = options.fetch ?? fetch;
|
|
89
|
+
const response = await fetchImpl("https://api.openai.com/v1/embeddings", {
|
|
90
|
+
method: "POST",
|
|
91
|
+
headers: {
|
|
92
|
+
"content-type": "application/json",
|
|
93
|
+
authorization: `Bearer ${apiKey}`,
|
|
94
|
+
},
|
|
95
|
+
body: JSON.stringify({
|
|
96
|
+
model: options.config.model ?? "text-embedding-3-small",
|
|
97
|
+
input,
|
|
98
|
+
encoding_format: "float",
|
|
99
|
+
...(options.config.dimensions ? { dimensions: options.config.dimensions } : {}),
|
|
100
|
+
}),
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
if (!response.ok) {
|
|
104
|
+
const text = await response.text().catch(() => "");
|
|
105
|
+
throw new AgentKitError(
|
|
106
|
+
"knowledge_embedding_failed",
|
|
107
|
+
`OpenAI embedding request failed with HTTP ${response.status}.${text ? ` ${truncate(text, 240)}` : ""}`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const payload = await response.json();
|
|
112
|
+
const embedding = payload?.data?.[0]?.embedding;
|
|
113
|
+
|
|
114
|
+
if (!Array.isArray(embedding) || embedding.some((value) => typeof value !== "number")) {
|
|
115
|
+
throw new AgentKitError("knowledge_embedding_failed", "OpenAI embedding response did not contain a numeric vector.");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return embedding;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function normalizeVector(values: number[]): number[] {
|
|
122
|
+
const norm = Math.sqrt(values.reduce((sum, value) => sum + value * value, 0));
|
|
123
|
+
|
|
124
|
+
if (norm === 0) {
|
|
125
|
+
return values;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return values.map((value) => Number((value / norm).toFixed(8)));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function truncate(value: string, maxLength: number): string {
|
|
132
|
+
return value.length <= maxLength ? value : `${value.slice(0, maxLength - 3)}...`;
|
|
133
|
+
}
|