@zauso-ai/capstan-agent 1.0.0-beta.6 → 1.0.0-beta.7

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.
@@ -0,0 +1,62 @@
1
+ export interface PaymentMandate {
2
+ /** Unique mandate ID */
3
+ id: string;
4
+ /** Maximum amount authorized */
5
+ maxAmount: number;
6
+ /** Currency code (ISO 4217) */
7
+ currency: string;
8
+ /** Mandate expiry (ISO 8601) */
9
+ expiresAt: string;
10
+ /** User who authorized this mandate */
11
+ authorizedBy: string;
12
+ /** Cryptographic signature of the mandate */
13
+ signature?: string;
14
+ }
15
+ export interface TransactionConfig {
16
+ /** Transaction name for discovery */
17
+ name: string;
18
+ /** Amount calculator */
19
+ amount: (input: unknown) => number;
20
+ /** Currency (default: USD) */
21
+ currency?: string;
22
+ /** Maximum amount per transaction */
23
+ maxAmount?: number;
24
+ }
25
+ export interface TransactionResult {
26
+ transactionId: string;
27
+ amount: number;
28
+ currency: string;
29
+ status: "completed" | "pending" | "failed";
30
+ mandateId?: string;
31
+ }
32
+ /**
33
+ * Define a transactable API endpoint.
34
+ * When an agent calls this, it must present a valid payment mandate.
35
+ */
36
+ export declare function defineTransaction(config: TransactionConfig): TransactionConfig;
37
+ /**
38
+ * Validate a payment mandate.
39
+ */
40
+ export declare function validateMandate(mandate: PaymentMandate): {
41
+ valid: boolean;
42
+ reason?: string;
43
+ };
44
+ /**
45
+ * Create a metered usage tracker for API calls.
46
+ */
47
+ export declare class UsageMeter {
48
+ private usage;
49
+ record(agentId: string, amount: number): void;
50
+ getUsage(agentId: string): {
51
+ calls: number;
52
+ totalAmount: number;
53
+ };
54
+ getAllUsage(): {
55
+ [k: string]: {
56
+ calls: number;
57
+ totalAmount: number;
58
+ };
59
+ };
60
+ reset(): void;
61
+ }
62
+ //# sourceMappingURL=commerce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commerce.d.ts","sourceRoot":"","sources":["../src/commerce.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACnC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAE9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAO5F;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAA6D;IAE1E,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAO7C,QAAQ,CAAC,OAAO,EAAE,MAAM;eATiB,MAAM;qBAAe,MAAM;;IAUpE,WAAW;;mBAV8B,MAAM;yBAAe,MAAM;;;IAWpE,KAAK;CACN"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Define a transactable API endpoint.
3
+ * When an agent calls this, it must present a valid payment mandate.
4
+ */
5
+ export function defineTransaction(config) {
6
+ return config;
7
+ }
8
+ /**
9
+ * Validate a payment mandate.
10
+ */
11
+ export function validateMandate(mandate) {
12
+ if (!mandate.id)
13
+ return { valid: false, reason: "Missing mandate ID" };
14
+ if (!mandate.maxAmount || mandate.maxAmount <= 0)
15
+ return { valid: false, reason: "Invalid amount" };
16
+ if (!mandate.currency)
17
+ return { valid: false, reason: "Missing currency" };
18
+ if (new Date(mandate.expiresAt) < new Date())
19
+ return { valid: false, reason: "Mandate expired" };
20
+ if (!mandate.authorizedBy)
21
+ return { valid: false, reason: "Missing authorization" };
22
+ return { valid: true };
23
+ }
24
+ /**
25
+ * Create a metered usage tracker for API calls.
26
+ */
27
+ export class UsageMeter {
28
+ usage = new Map();
29
+ record(agentId, amount) {
30
+ const current = this.usage.get(agentId) ?? { calls: 0, totalAmount: 0 };
31
+ current.calls++;
32
+ current.totalAmount += amount;
33
+ this.usage.set(agentId, current);
34
+ }
35
+ getUsage(agentId) { return this.usage.get(agentId) ?? { calls: 0, totalAmount: 0 }; }
36
+ getAllUsage() { return Object.fromEntries(this.usage); }
37
+ reset() { this.usage.clear(); }
38
+ }
39
+ //# sourceMappingURL=commerce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commerce.js","sourceRoot":"","sources":["../src/commerce.ts"],"names":[],"mappings":"AAkCA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACvE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IACpG,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC3E,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACjG,IAAI,CAAC,OAAO,CAAC,YAAY;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IACpF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,UAAU;IACb,KAAK,GAAG,IAAI,GAAG,EAAkD,CAAC;IAE1E,MAAM,CAAC,OAAe,EAAE,MAAc;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,QAAQ,CAAC,OAAe,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7F,WAAW,KAAK,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxD,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CAChC"}
package/dist/index.d.ts CHANGED
@@ -12,4 +12,8 @@ export type { McpTestResult } from "./testing.js";
12
12
  export { toLangChainTools, toLangChainToolSpecs } from "./langchain.js";
13
13
  export type { LangChainToolDefinition, ToLangChainOptions } from "./langchain.js";
14
14
  export type { AgentManifest, RouteRegistryEntry, AgentConfig } from "./types.js";
15
+ export { defineTransaction, validateMandate, UsageMeter, } from "./commerce.js";
16
+ export type { PaymentMandate, TransactionConfig, TransactionResult, } from "./commerce.js";
17
+ export { openaiProvider, anthropicProvider } from "./llm.js";
18
+ export type { LLMProvider, LLMMessage, LLMResponse, LLMStreamChunk, LLMOptions, } from "./llm.js";
15
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,GACf,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACxE,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAClF,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,GACf,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACxE,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAClF,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7D,YAAY,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,cAAc,EACd,UAAU,GACX,MAAM,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -7,4 +7,6 @@ export { withSpan } from "./telemetry.js";
7
7
  export { createMcpClient } from "./mcp-client.js";
8
8
  export { McpTestHarness, McpHttpTestClient } from "./testing.js";
9
9
  export { toLangChainTools, toLangChainToolSpecs } from "./langchain.js";
10
+ export { defineTransaction, validateMandate, UsageMeter, } from "./commerce.js";
11
+ export { openaiProvider, anthropicProvider } from "./llm.js";
10
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,GACf,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,GACf,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAGxE,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,UAAU,GACX,MAAM,eAAe,CAAC;AAMvB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}
package/dist/llm.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ export interface LLMMessage {
2
+ role: "system" | "user" | "assistant";
3
+ content: string;
4
+ }
5
+ export interface LLMResponse {
6
+ content: string;
7
+ model: string;
8
+ usage?: {
9
+ promptTokens: number;
10
+ completionTokens: number;
11
+ totalTokens: number;
12
+ } | undefined;
13
+ finishReason?: string | undefined;
14
+ }
15
+ export interface LLMStreamChunk {
16
+ content: string;
17
+ done: boolean;
18
+ }
19
+ export interface LLMOptions {
20
+ model?: string;
21
+ temperature?: number;
22
+ maxTokens?: number;
23
+ systemPrompt?: string;
24
+ responseFormat?: Record<string, unknown>;
25
+ }
26
+ export interface LLMProvider {
27
+ name: string;
28
+ chat(messages: LLMMessage[], options?: LLMOptions): Promise<LLMResponse>;
29
+ stream?(messages: LLMMessage[], options?: LLMOptions): AsyncIterable<LLMStreamChunk>;
30
+ }
31
+ export declare function openaiProvider(config: {
32
+ apiKey: string;
33
+ baseUrl?: string;
34
+ model?: string;
35
+ }): LLMProvider;
36
+ export declare function anthropicProvider(config: {
37
+ apiKey: string;
38
+ model?: string;
39
+ baseUrl?: string;
40
+ }): LLMProvider;
41
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,SAAS,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACzE,MAAM,CAAC,CACL,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,CAAC,EAAE,UAAU,GACnB,aAAa,CAAC,cAAc,CAAC,CAAC;CAClC;AAMD,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,WAAW,CA8Gd;AAMD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,WAAW,CAyDd"}
package/dist/llm.js ADDED
@@ -0,0 +1,166 @@
1
+ // ---------------------------------------------------------------------------
2
+ // LLM provider adapter interface and built-in implementations
3
+ // ---------------------------------------------------------------------------
4
+ // ---------------------------------------------------------------------------
5
+ // OpenAI-compatible provider
6
+ // ---------------------------------------------------------------------------
7
+ export function openaiProvider(config) {
8
+ const baseUrl = config.baseUrl ?? "https://api.openai.com/v1";
9
+ const defaultModel = config.model ?? "gpt-4o";
10
+ return {
11
+ name: "openai",
12
+ async chat(messages, options) {
13
+ const body = {
14
+ model: options?.model ?? defaultModel,
15
+ messages: options?.systemPrompt
16
+ ? [{ role: "system", content: options.systemPrompt }, ...messages]
17
+ : messages,
18
+ };
19
+ if (options?.temperature !== undefined)
20
+ body["temperature"] = options.temperature;
21
+ if (options?.maxTokens !== undefined)
22
+ body["max_tokens"] = options.maxTokens;
23
+ if (options?.responseFormat)
24
+ body["response_format"] = {
25
+ type: "json_schema",
26
+ json_schema: {
27
+ schema: options.responseFormat,
28
+ name: "response",
29
+ strict: true,
30
+ },
31
+ };
32
+ const res = await fetch(`${baseUrl}/chat/completions`, {
33
+ method: "POST",
34
+ headers: {
35
+ Authorization: `Bearer ${config.apiKey}`,
36
+ "Content-Type": "application/json",
37
+ },
38
+ body: JSON.stringify(body),
39
+ });
40
+ if (!res.ok)
41
+ throw new Error(`LLM error ${res.status}: ${await res.text()}`);
42
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
+ const data = (await res.json());
44
+ return {
45
+ content: data.choices?.[0]?.message?.content ?? "",
46
+ model: data.model ?? defaultModel,
47
+ usage: data.usage
48
+ ? {
49
+ promptTokens: data.usage.prompt_tokens,
50
+ completionTokens: data.usage.completion_tokens,
51
+ totalTokens: data.usage.total_tokens,
52
+ }
53
+ : undefined,
54
+ finishReason: data.choices?.[0]?.finish_reason,
55
+ };
56
+ },
57
+ async *stream(messages, options) {
58
+ const body = {
59
+ model: options?.model ?? defaultModel,
60
+ messages: options?.systemPrompt
61
+ ? [{ role: "system", content: options.systemPrompt }, ...messages]
62
+ : messages,
63
+ stream: true,
64
+ };
65
+ if (options?.temperature !== undefined)
66
+ body["temperature"] = options.temperature;
67
+ if (options?.maxTokens !== undefined)
68
+ body["max_tokens"] = options.maxTokens;
69
+ const res = await fetch(`${baseUrl}/chat/completions`, {
70
+ method: "POST",
71
+ headers: {
72
+ Authorization: `Bearer ${config.apiKey}`,
73
+ "Content-Type": "application/json",
74
+ },
75
+ body: JSON.stringify(body),
76
+ });
77
+ if (!res.ok)
78
+ throw new Error(`LLM error ${res.status}`);
79
+ if (!res.body)
80
+ throw new Error("No body");
81
+ const reader = res.body.getReader();
82
+ const decoder = new TextDecoder();
83
+ let buf = "";
84
+ while (true) {
85
+ const { done, value } = await reader.read();
86
+ if (done)
87
+ break;
88
+ buf += decoder.decode(value, { stream: true });
89
+ const lines = buf.split("\n");
90
+ buf = lines.pop() ?? "";
91
+ for (const line of lines) {
92
+ if (!line.startsWith("data: "))
93
+ continue;
94
+ const d = line.slice(6).trim();
95
+ if (d === "[DONE]") {
96
+ yield { content: "", done: true };
97
+ return;
98
+ }
99
+ try {
100
+ const p = JSON.parse(d);
101
+ const c = p.choices?.[0]?.delta?.content ?? "";
102
+ if (c)
103
+ yield { content: c, done: false };
104
+ }
105
+ catch {
106
+ // skip malformed chunks
107
+ }
108
+ }
109
+ }
110
+ yield { content: "", done: true };
111
+ },
112
+ };
113
+ }
114
+ // ---------------------------------------------------------------------------
115
+ // Anthropic provider
116
+ // ---------------------------------------------------------------------------
117
+ export function anthropicProvider(config) {
118
+ const baseUrl = config.baseUrl ?? "https://api.anthropic.com/v1";
119
+ const defaultModel = config.model ?? "claude-sonnet-4-20250514";
120
+ return {
121
+ name: "anthropic",
122
+ async chat(messages, options) {
123
+ const sys = options?.systemPrompt ??
124
+ messages.find((m) => m.role === "system")?.content;
125
+ const msgs = messages.filter((m) => m.role !== "system");
126
+ const body = {
127
+ model: options?.model ?? defaultModel,
128
+ messages: msgs,
129
+ max_tokens: options?.maxTokens ?? 4096,
130
+ };
131
+ if (sys)
132
+ body["system"] = sys;
133
+ if (options?.temperature !== undefined)
134
+ body["temperature"] = options.temperature;
135
+ const res = await fetch(`${baseUrl}/messages`, {
136
+ method: "POST",
137
+ headers: {
138
+ "x-api-key": config.apiKey,
139
+ "anthropic-version": "2023-06-01",
140
+ "Content-Type": "application/json",
141
+ },
142
+ body: JSON.stringify(body),
143
+ });
144
+ if (!res.ok)
145
+ throw new Error(`Anthropic error ${res.status}: ${await res.text()}`);
146
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
147
+ const data = (await res.json());
148
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
149
+ const text = data.content?.find((b) => b.type === "text")?.text ?? "";
150
+ return {
151
+ content: text,
152
+ model: data.model ?? defaultModel,
153
+ usage: data.usage
154
+ ? {
155
+ promptTokens: data.usage.input_tokens,
156
+ completionTokens: data.usage.output_tokens,
157
+ totalTokens: (data.usage.input_tokens ?? 0) +
158
+ (data.usage.output_tokens ?? 0),
159
+ }
160
+ : undefined,
161
+ finishReason: data.stop_reason,
162
+ };
163
+ },
164
+ };
165
+ }
166
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zauso-ai/capstan-agent",
3
- "version": "1.0.0-beta.6",
3
+ "version": "1.0.0-beta.7",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",