@perkos/perkos-a2a 0.8.35 → 0.9.1
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 +99 -21
- package/dist/agent.d.ts +14 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +363 -0
- package/dist/agent.js.map +1 -0
- package/dist/agentic-actions.js +472 -0
- package/dist/agentic-actions.js.map +1 -0
- package/dist/chat-client.d.ts +77 -0
- package/dist/chat-client.d.ts.map +1 -0
- package/dist/chat-client.js +364 -0
- package/dist/chat-client.js.map +1 -0
- package/dist/chat-store.d.ts +87 -0
- package/dist/chat-store.d.ts.map +1 -0
- package/dist/chat-store.js +233 -0
- package/dist/chat-store.js.map +1 -0
- package/dist/chat-types.d.ts +166 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +13 -0
- package/dist/chat-types.js.map +1 -0
- package/dist/hermes-cli.d.ts +30 -0
- package/dist/hermes-cli.d.ts.map +1 -0
- package/dist/hermes-cli.js +120 -0
- package/dist/hermes-cli.js.map +1 -0
- package/dist/hermes-plugin.d.ts +91 -0
- package/dist/hermes-plugin.d.ts.map +1 -0
- package/dist/hermes-plugin.js +196 -0
- package/dist/hermes-plugin.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1022 -26
- package/dist/index.js.map +4 -4
- package/dist/pairing.js +66 -0
- package/dist/pairing.js.map +1 -0
- package/dist/relay-client.js +222 -0
- package/dist/relay-client.js.map +1 -0
- package/dist/relay.js +274 -0
- package/dist/relay.js.map +1 -0
- package/dist/runtime-reply.js +137 -0
- package/dist/runtime-reply.js.map +1 -0
- package/dist/server.js +611 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +36 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -1
- package/dist/types.js.map +1 -1
- package/docs/chat-client.md +190 -0
- package/docs/demo-setup.md +273 -0
- package/openclaw.plugin.json +38 -1
- package/package.json +25 -21
- package/scripts/hermes/install.mjs +211 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { randomUUID } from "crypto";
|
|
2
|
+
function stripTaskMarker(text, marker) {
|
|
3
|
+
const trimmed = text.trim();
|
|
4
|
+
if (!trimmed.includes(marker))
|
|
5
|
+
return trimmed;
|
|
6
|
+
return trimmed.slice(trimmed.indexOf(marker) + marker.length).trim();
|
|
7
|
+
}
|
|
8
|
+
function requestedFinalMarker(text) {
|
|
9
|
+
const patterns = [
|
|
10
|
+
/termina(?:r)?\s+exactamente\s+con\s+([A-Z0-9_\-]+)/i,
|
|
11
|
+
/end\s+(?:exactly\s+)?with\s+([A-Z0-9_\-]+)/i,
|
|
12
|
+
];
|
|
13
|
+
for (const pattern of patterns) {
|
|
14
|
+
const match = text.match(pattern);
|
|
15
|
+
if (match?.[1])
|
|
16
|
+
return match[1];
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
function withRequestedMarker(reply, text) {
|
|
21
|
+
const marker = requestedFinalMarker(text);
|
|
22
|
+
if (!marker || reply.trim().endsWith(marker))
|
|
23
|
+
return reply;
|
|
24
|
+
return `${reply.trim()} ${marker}`;
|
|
25
|
+
}
|
|
26
|
+
function runtimeOption(config, key) {
|
|
27
|
+
const value = config.runtime?.[key];
|
|
28
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
29
|
+
}
|
|
30
|
+
function agentIdFor(config) {
|
|
31
|
+
return runtimeOption(config, "agentId") || config.agentName || "perkos-a2a-agent";
|
|
32
|
+
}
|
|
33
|
+
function llmSystemPrompt(config) {
|
|
34
|
+
const agentName = config.agentName || config.runtime?.kind || "PerkOS A2A agent";
|
|
35
|
+
return [
|
|
36
|
+
`You are ${agentName}, a PerkOS A2A agent.`,
|
|
37
|
+
"Reply concisely and directly.",
|
|
38
|
+
"If asked to confirm receipt, confirm that you received the task via PerkOS A2A and are using PerkOS LLM.",
|
|
39
|
+
"Do not mention implementation details unless asked.",
|
|
40
|
+
].join(" ");
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Generate a final task reply through PerkOS LLM when the local runtime accepts
|
|
44
|
+
* a task but does not expose a synchronous final answer API.
|
|
45
|
+
*
|
|
46
|
+
* This keeps A2A task state machine semantics intact: delivery/wake still
|
|
47
|
+
* happens, while the A2A caller receives a terminal task with a useful artifact
|
|
48
|
+
* instead of being left in `working` indefinitely.
|
|
49
|
+
*/
|
|
50
|
+
export async function generateRuntimeReply(config, text, marker) {
|
|
51
|
+
const runtimeKind = config.runtime?.kind || "openclaw";
|
|
52
|
+
const apiKey = runtimeOption(config, "llmApiKey");
|
|
53
|
+
if (!apiKey) {
|
|
54
|
+
const agentName = config.agentName || config.runtime?.kind || "PerkOS A2A agent";
|
|
55
|
+
const lower = text.toLowerCase();
|
|
56
|
+
if (lower.includes("confirma") || lower.includes("confirm") || lower.includes("ping")) {
|
|
57
|
+
return withRequestedMarker(`${agentName} recibió este mensaje vía PerkOS A2A.`, text);
|
|
58
|
+
}
|
|
59
|
+
return withRequestedMarker([
|
|
60
|
+
`${agentName} recibió la tarea vía PerkOS A2A.`,
|
|
61
|
+
"El runtime/LLM local no está configurado para generar una respuesta completa en este momento, pero el transporte A2A y el estado terminal funcionan.",
|
|
62
|
+
].join(" "), text);
|
|
63
|
+
}
|
|
64
|
+
const headers = {
|
|
65
|
+
"content-type": "application/json",
|
|
66
|
+
authorization: `Bearer ${apiKey}`,
|
|
67
|
+
"x-agent-id": agentIdFor(config),
|
|
68
|
+
};
|
|
69
|
+
const system = llmSystemPrompt(config);
|
|
70
|
+
const user = [
|
|
71
|
+
text,
|
|
72
|
+
"",
|
|
73
|
+
"Return only the useful final answer.",
|
|
74
|
+
`Do not include ${marker}; the A2A bridge will attach the marker/task result.`,
|
|
75
|
+
].join("\n");
|
|
76
|
+
if (runtimeKind === "hermes") {
|
|
77
|
+
const base = (runtimeOption(config, "openAiBaseUrl") || "https://api.llm.perkos.xyz/v1").replace(/\/+$/, "");
|
|
78
|
+
const model = runtimeOption(config, "model") || "kimi-k2.6:cloud";
|
|
79
|
+
const response = await fetch(`${base}/chat/completions`, {
|
|
80
|
+
method: "POST",
|
|
81
|
+
headers,
|
|
82
|
+
body: JSON.stringify({
|
|
83
|
+
model,
|
|
84
|
+
messages: [
|
|
85
|
+
{ role: "system", content: system },
|
|
86
|
+
{ role: "user", content: user },
|
|
87
|
+
],
|
|
88
|
+
temperature: 0.2,
|
|
89
|
+
}),
|
|
90
|
+
});
|
|
91
|
+
if (!response.ok) {
|
|
92
|
+
const body = await response.text().catch(() => "");
|
|
93
|
+
throw new Error(`PerkOS LLM OpenAI-compatible call failed (${response.status}): ${body || response.statusText}`);
|
|
94
|
+
}
|
|
95
|
+
const data = await response.json();
|
|
96
|
+
return stripTaskMarker(data.choices?.[0]?.message?.content || "Task completed.", marker);
|
|
97
|
+
}
|
|
98
|
+
const base = (runtimeOption(config, "ollamaBaseUrl") || "https://api.llm.perkos.xyz").replace(/\/+$/, "");
|
|
99
|
+
const model = runtimeOption(config, "model") || "kimi-k2.6:cloud";
|
|
100
|
+
const response = await fetch(`${base}/api/chat`, {
|
|
101
|
+
method: "POST",
|
|
102
|
+
headers,
|
|
103
|
+
body: JSON.stringify({
|
|
104
|
+
model,
|
|
105
|
+
stream: false,
|
|
106
|
+
messages: [
|
|
107
|
+
{ role: "system", content: system },
|
|
108
|
+
{ role: "user", content: user },
|
|
109
|
+
],
|
|
110
|
+
}),
|
|
111
|
+
});
|
|
112
|
+
if (!response.ok) {
|
|
113
|
+
const body = await response.text().catch(() => "");
|
|
114
|
+
throw new Error(`PerkOS LLM Ollama-compatible call failed (${response.status}): ${body || response.statusText}`);
|
|
115
|
+
}
|
|
116
|
+
const data = await response.json();
|
|
117
|
+
return stripTaskMarker(data.message?.content || data.response || "Task completed.", marker);
|
|
118
|
+
}
|
|
119
|
+
export function completeTaskWithReply(task, finalText) {
|
|
120
|
+
task.artifacts.push({
|
|
121
|
+
kind: "artifact",
|
|
122
|
+
artifactId: randomUUID(),
|
|
123
|
+
parts: [{ kind: "text", text: finalText }],
|
|
124
|
+
});
|
|
125
|
+
task.status = {
|
|
126
|
+
state: "completed",
|
|
127
|
+
timestamp: new Date().toISOString(),
|
|
128
|
+
message: {
|
|
129
|
+
role: "agent",
|
|
130
|
+
parts: [{ kind: "text", text: finalText }],
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
export function isTerminalTaskState(state) {
|
|
135
|
+
return state === "completed" || state === "failed" || state === "canceled";
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=runtime-reply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-reply.js","sourceRoot":"","sources":["../src/runtime-reply.ts"],"names":[],"mappings":"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"}
|