1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import assert from "node:assert/strict";
import { test } from "node:test";
import { abiTest, loadModule } from "../../test/check.mjs";
const inference = await loadModule("cocore-inference");
abiTest(test, inference);
const API = "https://cocore.dev/api/v1";
// The host's grant: a service-auth token minted per request with the run's session (atlibs http serviceAuth).
const HTTP = { "https://cocore.dev": { serviceAuth: { aud: "did:web:cocore.dev", lxm: "dev.cocore.inference.dispatch" } } };
const COCORE = { provider: "did:plc:prov", receipt: "at://did:plc:prov/dev.cocore.compute.receipt/3r" };
// The session answers getServiceAuth (held to the module's session scope by check.mjs); fetch is cocore.dev.
function host(answer) {
const sent = [];
const minted = [];
const respond = ({ nsid, params }) => (minted.push([nsid, params]), { ok: true, output: { token: "svc-token" } });
const fetch = async (url, init) => (sent.push({ url, headers: init.headers, body: init.body && JSON.parse(init.body) }), answer(url, init));
return { sent, minted, options: { respond, fetch, http: HTTP } };
}
test("chat: one chat completion at cocore.dev/api/v1, authorized by the host's service-auth token", async () => {
const h = host(() => Response.json({ model: "stub", choices: [{ index: 0, message: { role: "assistant", content: "Hello!" }, finish_reason: "stop" }], usage: { prompt_tokens: 3, completion_tokens: 2 }, x_cocore: COCORE }));
const ran = await inference.handle("chat", { prompt: "Hi", system: "be brief", maxTokens: "16", country: "US" }, h.options);
assert.equal(ran.error, undefined, ran.error);
assert.deepEqual(ran.result, { text: "Hello!", finishReason: "stop", toolCalls: [], model: "stub", usage: { prompt_tokens: 3, completion_tokens: 2 }, cocore: COCORE });
assert.deepEqual(h.minted, [["com.atproto.server.getServiceAuth", { aud: "did:web:cocore.dev", lxm: "dev.cocore.inference.dispatch" }]]);
assert.equal(h.sent[0].url, `${API}/chat/completions`);
assert.equal(h.sent[0].headers.authorization, "Bearer svc-token");
assert.deepEqual(h.sent[0].body, { model: "stub", messages: [{ role: "system", content: "be brief" }, { role: "user", content: "Hi" }], max_tokens: 16, stream: false, country: "US" });
});
test("chat: a streamed answer is collected (text, tool calls, usage, x_cocore); routes", async () => {
const frames = [
{ model: "stub", choices: [{ index: 0, delta: { role: "assistant", content: "Hel" } }] },
{ choices: [{ index: 0, delta: { content: "lo", tool_calls: [{ index: 0, id: "c1", type: "function", function: { name: "get_weather", arguments: '{"city":' } }] } }] },
{ choices: [{ index: 0, delta: { tool_calls: [{ index: 0, function: { arguments: '"Amsterdam"}' } }] }, finish_reason: "tool_calls" }] },
{ choices: [], usage: { prompt_tokens: 4, completion_tokens: 6 }, x_cocore: COCORE },
];
const sse = frames.map((f) => `data: ${JSON.stringify(f)}\n\n`).join("") + "data: [DONE]\n\n";
const h = host(() => new Response(sse, { headers: { "content-type": "text/event-stream" } }));
const ran = await inference.handle("chat", { prompt: "Hi", stream: "true", route: "verified", minTrust: "confidential" }, h.options);
assert.equal(ran.error, undefined, ran.error);
assert.deepEqual(ran.result, {
text: "Hello",
finishReason: "tool_calls",
toolCalls: [{ id: "c1", type: "function", function: { name: "get_weather", arguments: '{"city":"Amsterdam"}' } }],
model: "stub",
usage: { prompt_tokens: 4, completion_tokens: 6 },
cocore: COCORE,
});
assert.equal(h.sent[0].url, `${API}/verified/chat/completions`);
assert.equal(h.sent[0].headers.accept, "text/event-stream");
assert.equal(h.sent[0].body.min_trust, "confidential");
});
test("onboarding_required says to connect co/core once; other errors keep co/core's code and message", async () => {
const error = (status, body) => host(() => Response.json(body, { status }));
const onboarding = await inference.handle("chat", { prompt: "Hi" }, error(401, { error: { type: "authentication_error", code: "onboarding_required", message: "..." } }).options);
assert.equal(onboarding.error, "co/core: this account has not connected co/core yet: sign in at https://cocore.dev once, then try again (onboarding_required)");
const bad = await inference.handle("chat", { prompt: "Hi" }, error(401, { error: { message: "Invalid API key", type: "authentication_error", code: "invalid_api_key", param: null } }).options);
assert.equal(bad.error, "co/core HTTP 401 invalid_api_key: Invalid API key");
const tools = await inference.handle("chat", { prompt: "Hi" }, error(400, { error: { type: "invalid_request_error", code: "tool_calls_not_supported", message: "no canary" } }).options);
assert.equal(tools.error, "co/core HTTP 400 tool_calls_not_supported: no canary");
// signed out: the host cannot mint the token
const signedOut = await inference.handle("chat", { prompt: "Hi" }, { ...host(() => assert.fail("never sent")).options, respond: () => ({ ok: false, error: "no session" }) });
assert.match(signedOut.error, /needs a service-auth token \(aud did:web:cocore\.dev, lxm dev\.cocore\.inference\.dispatch\) from the run's session: no session/);
});
test("chat checks its input; models reads the public directory", async () => {
const start = (fields) => inference.run("chat", { did: "did:plc:x", ...fields, state: null, event: { type: "start" } });
assert.match(start({}).error, /prompt \(or messages with a user message\) is required/);
assert.match(start({ prompt: "p", maxTokens: "0" }).error, /at least 1/);
assert.match(start({ prompt: "p", route: "nope" }).error, /open, private, verified or probono/);
assert.match(start({ messages: "[" }).error, /messages:/);
const h = host((url) => Response.json({ object: "list", data: [{ id: "stub", object: "model" }], url }));
const ran = await inference.handle("models", { view: "summary" }, h.options);
assert.deepEqual(ran.result.data, [{ id: "stub", object: "model" }]);
assert.equal(h.sent[0].url, `${API}/models?view=summary`);
});