@sema-agent/core
Version:
Stateless, task-oriented AI agent core
43 lines (42 loc) • 1.61 kB
JavaScript
import { createAssistantMessageEventStream, } from "../internal/llm.js";
import { ZERO_USAGE } from "./errors.js";
function errorMessage(model, text) {
return {
role: "assistant",
content: [{ type: "text", text: "" }],
api: model.api,
provider: model.provider,
model: model.id,
stopReason: "error",
errorMessage: text,
usage: ZERO_USAGE,
timestamp: Date.now(),
};
}
export function createRoutingBrain(routes, opts = {}) {
const by = opts.by ?? "provider";
const resolveTarget = (model) => {
const key = by === "api" ? model.api : model.provider;
const routed = Object.hasOwn(routes, key) ? routes[key] : undefined;
const matched = routed !== null && typeof routed === "object" && typeof routed.stream === "function"
? routed
: undefined;
return matched ?? opts.fallback;
};
const stream = (model, context, options) => {
const key = by === "api" ? model.api : model.provider;
const target = resolveTarget(model);
if (!target) {
const out = createAssistantMessageEventStream();
out.push({
type: "error",
reason: "error",
error: errorMessage(model, `createRoutingBrain: no brain for ${by}="${key}"`),
});
return out;
}
return target.stream(model, context, options);
};
const adjudicateRoute = (model, perModelAuth) => resolveTarget(model)?.adjudicateRoute?.(model, perModelAuth);
return { stream, adjudicateRoute };
}