@nebutra/agents 1.1.0 → 1.1.2
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/LICENSE +21 -676
- package/README.md +7 -3
- package/dist/{agent-CahnMASx.d.ts → agent-DDGWuUpe.d.ts} +1 -1
- package/{src/env.ts → dist/chunk-BMSL4E4A.js} +23 -47
- package/dist/{chunk-5JZJ5KMC.js → chunk-BZKIMAGK.js} +16 -7
- package/dist/{chunk-NPQECBXL.js → chunk-GRSMUTUS.js} +60 -7
- package/dist/{chunk-B7XWL35G.js → chunk-QYZDHC5A.js} +5 -1
- package/dist/{chunk-RLWM437Q.js → chunk-RNFUEMUB.js} +10 -3
- package/dist/chunk-RWQL4HXC.js +171 -0
- package/dist/{chunk-NVPE5EDI.js → chunk-V6VC2O6Q.js} +4 -3
- package/dist/chunk-VZPQOXWW.js +47 -0
- package/dist/{chunk-5LX742GP.js → chunk-XLBS3XUI.js} +4 -50
- package/dist/env.d.ts +42 -0
- package/dist/env.js +12 -0
- package/dist/fallback.d.ts +100 -0
- package/dist/fallback.js +18 -0
- package/dist/generation/index.d.ts +122 -0
- package/dist/generation/index.js +19 -0
- package/dist/index.d.ts +21 -328
- package/dist/index.js +57 -245
- package/dist/observability.d.ts +46 -0
- package/dist/observability.js +13 -0
- package/dist/providers/langchain.d.ts +2 -2
- package/dist/providers/vercel-ai.d.ts +2 -2
- package/dist/providers/vercel-ai.js +15 -7
- package/dist/sdk/config.d.ts +3 -0
- package/dist/sdk/config.js +1 -1
- package/dist/sdk/index.d.ts +36 -3
- package/dist/sdk/index.js +20 -7
- package/dist/sdk/models.d.ts +18 -6
- package/dist/sdk/models.js +1 -1
- package/dist/sdk/provider.d.ts +1 -0
- package/dist/sdk/provider.js +3 -3
- package/dist/tools.d.ts +1 -1
- package/dist/{types-NtgB3pch.d.ts → types-BytC-HfQ.d.ts} +1 -5
- package/package.json +73 -27
- package/.turbo/turbo-build.log +0 -40
- package/.turbo/turbo-test.log +0 -18
- package/.turbo/turbo-typecheck.log +0 -4
- package/AGENTS.md +0 -63
- package/CHANGELOG.md +0 -26
- package/src/__tests__/cost-observability.test.ts +0 -172
- package/src/__tests__/fallback-wiring.test.ts +0 -313
- package/src/__tests__/generation.test.ts +0 -111
- package/src/__tests__/public-api.test.ts +0 -114
- package/src/agent.ts +0 -117
- package/src/context.ts +0 -99
- package/src/fallback.ts +0 -358
- package/src/generation/index.ts +0 -157
- package/src/generation/mock-provider.ts +0 -123
- package/src/generation/types.ts +0 -87
- package/src/index.ts +0 -104
- package/src/memory.ts +0 -126
- package/src/observability.ts +0 -102
- package/src/orchestrator.ts +0 -147
- package/src/providers/langchain.ts +0 -28
- package/src/providers/vercel-ai.ts +0 -114
- package/src/router.ts +0 -158
- package/src/sdk/config.ts +0 -73
- package/src/sdk/index.ts +0 -214
- package/src/sdk/models.ts +0 -57
- package/src/sdk/provider.ts +0 -80
- package/src/tenant.ts +0 -52
- package/src/tools.ts +0 -65
- package/src/types.ts +0 -114
- package/tsconfig.json +0 -12
- package/tsup.config.ts +0 -21
package/src/sdk/provider.ts
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { createOpenAI } from "@ai-sdk/openai";
|
|
2
|
-
import { createOpenRouter } from "@openrouter/ai-sdk-provider";
|
|
3
|
-
import type { EmbeddingModel, LanguageModel } from "ai";
|
|
4
|
-
import { type ResolvedNebutraAIConfig, resolveApiKey } from "./config";
|
|
5
|
-
import { resolveModel } from "./models";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Creates a language model instance based on the resolved config.
|
|
9
|
-
*
|
|
10
|
-
* Provider routing:
|
|
11
|
-
* - "openrouter" → @openrouter/ai-sdk-provider (300+ models, failover)
|
|
12
|
-
* - "openai" → @ai-sdk/openai (direct OpenAI API)
|
|
13
|
-
* - "siliconflow" → @ai-sdk/openai with SiliconFlow baseURL (OpenAI-compatible)
|
|
14
|
-
* - "gateway" → Vercel AI Gateway via plain model string (OIDC auth)
|
|
15
|
-
*/
|
|
16
|
-
export function createModel(modelOrPreset: string, config: ResolvedNebutraAIConfig): LanguageModel {
|
|
17
|
-
const modelId = resolveModel(modelOrPreset);
|
|
18
|
-
const apiKey = resolveApiKey(config);
|
|
19
|
-
|
|
20
|
-
switch (config.provider) {
|
|
21
|
-
case "openrouter": {
|
|
22
|
-
const provider = createOpenRouter({
|
|
23
|
-
apiKey,
|
|
24
|
-
...(config.headers ? { headers: config.headers } : {}),
|
|
25
|
-
...(config.extraBody ? { extraBody: config.extraBody } : {}),
|
|
26
|
-
});
|
|
27
|
-
return provider.chat(modelId);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
case "openai": {
|
|
31
|
-
const provider = createOpenAI({ apiKey });
|
|
32
|
-
return provider(modelId);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
case "siliconflow": {
|
|
36
|
-
// SiliconFlow: OpenAI-compatible API with China-optimized infra
|
|
37
|
-
// Models use "Vendor/Model" format, e.g. "Qwen/Qwen2.5-72B-Instruct"
|
|
38
|
-
const provider = createOpenAI({
|
|
39
|
-
apiKey,
|
|
40
|
-
baseURL: "https://api.siliconflow.cn/v1",
|
|
41
|
-
});
|
|
42
|
-
return provider(modelId);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
case "gateway": {
|
|
46
|
-
// Vercel AI Gateway: use @ai-sdk/openai with gateway baseURL
|
|
47
|
-
// OIDC token is passed as apiKey, routed through Vercel's proxy
|
|
48
|
-
const provider = createOpenAI({
|
|
49
|
-
apiKey,
|
|
50
|
-
baseURL: "https://ai-gateway.vercel.sh/v1",
|
|
51
|
-
});
|
|
52
|
-
return provider(modelId);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Creates an embedding model instance for vector operations.
|
|
59
|
-
* Only supported with OpenRouter provider.
|
|
60
|
-
*/
|
|
61
|
-
export function createEmbeddingModel(
|
|
62
|
-
modelOrPreset: string,
|
|
63
|
-
config: ResolvedNebutraAIConfig,
|
|
64
|
-
): EmbeddingModel {
|
|
65
|
-
const modelId = resolveModel(modelOrPreset);
|
|
66
|
-
const apiKey = resolveApiKey(config);
|
|
67
|
-
|
|
68
|
-
if (config.provider !== "openrouter") {
|
|
69
|
-
throw new Error(
|
|
70
|
-
`[@nebutra/agents] Embedding models are currently only supported with the "openrouter" provider.`,
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const provider = createOpenRouter({
|
|
75
|
-
apiKey,
|
|
76
|
-
...(config.headers ? { headers: config.headers } : {}),
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
return provider.textEmbeddingModel(modelId);
|
|
80
|
-
}
|
package/src/tenant.ts
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tenant-scoped agent execution context.
|
|
3
|
-
*
|
|
4
|
-
* Ensures every agent operation carries tenantId for RLS,
|
|
5
|
-
* billing, and audit trail purposes.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { AgentContext } from "./types";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Create a fully-populated AgentContext.
|
|
12
|
-
* Generates a random conversationId when none is provided.
|
|
13
|
-
*/
|
|
14
|
-
export function createAgentContext(
|
|
15
|
-
tenantId: string,
|
|
16
|
-
userId: string,
|
|
17
|
-
conversationId?: string,
|
|
18
|
-
metadata?: Record<string, unknown>,
|
|
19
|
-
): AgentContext {
|
|
20
|
-
return {
|
|
21
|
-
tenantId,
|
|
22
|
-
userId,
|
|
23
|
-
conversationId: conversationId ?? crypto.randomUUID(),
|
|
24
|
-
...(metadata !== undefined ? { metadata } : {}),
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Validate that a tenant has remaining quota for agent execution.
|
|
30
|
-
*
|
|
31
|
-
* Returns `{ allowed: true, remaining: -1 }` (unlimited) by default.
|
|
32
|
-
* Integrate with @nebutra/billing entitlements for production usage.
|
|
33
|
-
*/
|
|
34
|
-
export async function checkAgentQuota(
|
|
35
|
-
tenantId: string,
|
|
36
|
-
): Promise<{ allowed: boolean; remaining: number }> {
|
|
37
|
-
try {
|
|
38
|
-
const { getCreditBalance } = await import("@nebutra/billing/credits");
|
|
39
|
-
const balance = await getCreditBalance(tenantId);
|
|
40
|
-
|
|
41
|
-
// Simple quota check: tenant must have positive credits
|
|
42
|
-
// In production, we might check plan-specific monthly limits beforehand
|
|
43
|
-
if (balance.balance > 0) {
|
|
44
|
-
return { allowed: true, remaining: balance.balance };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return { allowed: false, remaining: 0 };
|
|
48
|
-
} catch (_err) {
|
|
49
|
-
// Failsafe open if billing is unconfigured
|
|
50
|
-
return { allowed: true, remaining: -1 };
|
|
51
|
-
}
|
|
52
|
-
}
|
package/src/tools.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Built-in tool registry for agents.
|
|
3
|
-
*
|
|
4
|
-
* These are safe, tenant-scoped stubs that demonstrate the tool interface.
|
|
5
|
-
* Each tool requires configuration (API keys, vector stores, etc.) before
|
|
6
|
-
* it produces real results.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { AgentTool } from "./types";
|
|
10
|
-
|
|
11
|
-
/** Search the web for current information. */
|
|
12
|
-
export const webSearchTool: AgentTool = {
|
|
13
|
-
name: "web_search",
|
|
14
|
-
description: "Search the web for current information",
|
|
15
|
-
inputSchema: {
|
|
16
|
-
type: "object",
|
|
17
|
-
properties: { query: { type: "string" } },
|
|
18
|
-
required: ["query"],
|
|
19
|
-
},
|
|
20
|
-
execute: async (_input, _context) => {
|
|
21
|
-
return {
|
|
22
|
-
results: [],
|
|
23
|
-
note: "Configure TAVILY_API_KEY or SERPER_API_KEY for live search",
|
|
24
|
-
};
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/** Query the tenant's database (tenant-scoped via RLS). */
|
|
29
|
-
export const databaseQueryTool: AgentTool = {
|
|
30
|
-
name: "database_query",
|
|
31
|
-
description: "Query the tenant's database",
|
|
32
|
-
inputSchema: {
|
|
33
|
-
type: "object",
|
|
34
|
-
properties: { query: { type: "string" } },
|
|
35
|
-
required: ["query"],
|
|
36
|
-
},
|
|
37
|
-
execute: async (_input, context) => {
|
|
38
|
-
return {
|
|
39
|
-
note: `Query would execute in tenant ${context.tenantId} scope`,
|
|
40
|
-
};
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/** RAG-style knowledge base retrieval. */
|
|
45
|
-
export const knowledgeBaseTool: AgentTool = {
|
|
46
|
-
name: "knowledge_base",
|
|
47
|
-
description: "Search the organization's knowledge base for relevant documents",
|
|
48
|
-
inputSchema: {
|
|
49
|
-
type: "object",
|
|
50
|
-
properties: {
|
|
51
|
-
query: { type: "string" },
|
|
52
|
-
limit: { type: "number" },
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
execute: async (_input, _context) => {
|
|
56
|
-
return { documents: [], note: "Configure vector store for RAG" };
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
/** All pre-built tools. */
|
|
61
|
-
export const BUILT_IN_TOOLS: readonly AgentTool[] = [
|
|
62
|
-
webSearchTool,
|
|
63
|
-
databaseQueryTool,
|
|
64
|
-
knowledgeBaseTool,
|
|
65
|
-
];
|
package/src/types.ts
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core types for the multi-agent orchestration engine.
|
|
3
|
-
*
|
|
4
|
-
* All tenant-scoped operations require an AgentContext carrying `tenantId`.
|
|
5
|
-
* Usage tracking is emitted on every execution for downstream billing.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
// ─── Agent Configuration ──────────────────────────────────────────────────────
|
|
9
|
-
|
|
10
|
-
export interface AgentConfig {
|
|
11
|
-
/** Unique identifier for this agent */
|
|
12
|
-
readonly id: string;
|
|
13
|
-
/** Human-readable name */
|
|
14
|
-
readonly name: string;
|
|
15
|
-
/** What this agent does (used by the router for intent matching) */
|
|
16
|
-
readonly description: string;
|
|
17
|
-
/** Model identifier, e.g. "openai/gpt-5.4" or "anthropic/claude-sonnet-4.6" */
|
|
18
|
-
readonly model: string;
|
|
19
|
-
/** System prompt / instructions */
|
|
20
|
-
readonly instructions: string;
|
|
21
|
-
/** Tools this agent can invoke */
|
|
22
|
-
readonly tools?: readonly AgentTool[];
|
|
23
|
-
/** Maximum tool-loop iterations (default 20) */
|
|
24
|
-
readonly maxSteps?: number;
|
|
25
|
-
/** Memory configuration */
|
|
26
|
-
readonly memory?: MemoryConfig;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// ─── Tools ────────────────────────────────────────────────────────────────────
|
|
30
|
-
|
|
31
|
-
export interface AgentTool {
|
|
32
|
-
readonly name: string;
|
|
33
|
-
readonly description: string;
|
|
34
|
-
readonly inputSchema: Record<string, unknown>;
|
|
35
|
-
readonly execute: (input: unknown, context: AgentContext) => Promise<unknown>;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// ─── Execution Context ────────────────────────────────────────────────────────
|
|
39
|
-
|
|
40
|
-
export interface AgentContext {
|
|
41
|
-
readonly tenantId: string;
|
|
42
|
-
readonly userId: string;
|
|
43
|
-
readonly conversationId: string;
|
|
44
|
-
readonly metadata?: Record<string, unknown>;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// ─── Messages ─────────────────────────────────────────────────────────────────
|
|
48
|
-
|
|
49
|
-
export interface AgentMessage {
|
|
50
|
-
readonly role: "user" | "assistant" | "system" | "tool";
|
|
51
|
-
readonly content: string;
|
|
52
|
-
readonly toolCalls?: readonly ToolCallResult[];
|
|
53
|
-
readonly timestamp: Date;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface ToolCallResult {
|
|
57
|
-
readonly toolName: string;
|
|
58
|
-
readonly args: unknown;
|
|
59
|
-
readonly result: unknown;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// ─── Response ─────────────────────────────────────────────────────────────────
|
|
63
|
-
|
|
64
|
-
export interface AgentResponse {
|
|
65
|
-
readonly messages: readonly AgentMessage[];
|
|
66
|
-
readonly usage: TokenUsage;
|
|
67
|
-
readonly finishReason: string;
|
|
68
|
-
readonly agentId: string;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export interface TokenUsage {
|
|
72
|
-
readonly promptTokens: number;
|
|
73
|
-
readonly completionTokens: number;
|
|
74
|
-
readonly totalTokens: number;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// ─── Memory ───────────────────────────────────────────────────────────────────
|
|
78
|
-
|
|
79
|
-
export interface MemoryConfig {
|
|
80
|
-
readonly shortTerm?: { readonly maxMessages: number };
|
|
81
|
-
readonly longTerm?: { readonly enabled: boolean };
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// ─── Orchestrator ─────────────────────────────────────────────────────────────
|
|
85
|
-
|
|
86
|
-
export interface OrchestratorConfig {
|
|
87
|
-
readonly agents: readonly AgentConfig[];
|
|
88
|
-
readonly router?: RouterConfig;
|
|
89
|
-
readonly defaultAgentId?: string;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export interface RouterConfig {
|
|
93
|
-
readonly strategy: "keyword" | "llm" | "custom";
|
|
94
|
-
readonly customRouter?: (message: string, context: AgentContext) => Promise<string>;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export interface PipelineStep {
|
|
98
|
-
readonly agentId: string;
|
|
99
|
-
readonly transformInput?: (prevOutput: string) => string;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// ─── Usage / Billing ──────────────────────────────────────────────────────────
|
|
103
|
-
|
|
104
|
-
export interface AgentUsageEvent {
|
|
105
|
-
readonly tenantId: string;
|
|
106
|
-
readonly userId: string;
|
|
107
|
-
readonly agentId: string;
|
|
108
|
-
readonly model: string;
|
|
109
|
-
readonly promptTokens: number;
|
|
110
|
-
readonly completionTokens: number;
|
|
111
|
-
readonly totalTokens: number;
|
|
112
|
-
readonly durationMs: number;
|
|
113
|
-
readonly timestamp: Date;
|
|
114
|
-
}
|
package/tsconfig.json
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../../tsconfig.base.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "bundler",
|
|
6
|
-
"target": "esnext",
|
|
7
|
-
"types": ["node"],
|
|
8
|
-
"incremental": false
|
|
9
|
-
},
|
|
10
|
-
"include": ["src"],
|
|
11
|
-
"exclude": ["node_modules", "dist"]
|
|
12
|
-
}
|
package/tsup.config.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from "tsup";
|
|
2
|
-
|
|
3
|
-
export default defineConfig({
|
|
4
|
-
entry: [
|
|
5
|
-
"src/index.ts",
|
|
6
|
-
"src/tools.ts",
|
|
7
|
-
"src/providers/vercel-ai.ts",
|
|
8
|
-
"src/providers/langchain.ts",
|
|
9
|
-
"src/sdk/index.ts",
|
|
10
|
-
"src/sdk/config.ts",
|
|
11
|
-
"src/sdk/models.ts",
|
|
12
|
-
"src/sdk/provider.ts",
|
|
13
|
-
],
|
|
14
|
-
format: ["esm"],
|
|
15
|
-
dts: true,
|
|
16
|
-
clean: true,
|
|
17
|
-
target: "node20",
|
|
18
|
-
outDir: "dist",
|
|
19
|
-
splitting: true,
|
|
20
|
-
external: ["ai", "@nebutra/logger", "@nebutra/cache", "@nebutra/billing"],
|
|
21
|
-
});
|