UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

43 lines (42 loc) • 1.61 kB
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 }; }