@adonis-agora/agent 0.1.0
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 -0
- package/dist/configure.d.ts +18 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +29 -0
- package/dist/configure.js.map +1 -0
- package/dist/providers/agent_provider.d.ts +25 -0
- package/dist/providers/agent_provider.d.ts.map +1 -0
- package/dist/providers/agent_provider.js +511 -0
- package/dist/providers/agent_provider.js.map +1 -0
- package/dist/src/actor-resolver.d.ts +41 -0
- package/dist/src/actor-resolver.d.ts.map +1 -0
- package/dist/src/agent-deps-factory.d.ts +59 -0
- package/dist/src/agent-deps-factory.d.ts.map +1 -0
- package/dist/src/agent-deps-factory.js +111 -0
- package/dist/src/agent-deps-factory.js.map +1 -0
- package/dist/src/agent-deps.d.ts +42 -0
- package/dist/src/agent-deps.d.ts.map +1 -0
- package/dist/src/agent-deps.js +5 -0
- package/dist/src/agent-deps.js.map +1 -0
- package/dist/src/agent-loop.d.ts +101 -0
- package/dist/src/agent-loop.d.ts.map +1 -0
- package/dist/src/agent-loop.js +396 -0
- package/dist/src/agent-loop.js.map +1 -0
- package/dist/src/agent-registry.d.ts +10 -0
- package/dist/src/agent-registry.d.ts.map +1 -0
- package/dist/src/agent-service.d.ts +50 -0
- package/dist/src/agent-service.d.ts.map +1 -0
- package/dist/src/agent-service.js +82 -0
- package/dist/src/agent-service.js.map +1 -0
- package/dist/src/ai-sdk/ai-sdk-model.d.ts +17 -0
- package/dist/src/ai-sdk/ai-sdk-model.d.ts.map +1 -0
- package/dist/src/ai-sdk/ai-sdk-model.js +263 -0
- package/dist/src/ai-sdk/ai-sdk-model.js.map +1 -0
- package/dist/src/ai-sdk/index.d.ts +2 -0
- package/dist/src/ai-sdk/index.d.ts.map +1 -0
- package/dist/src/ai-tool-ref.d.ts +79 -0
- package/dist/src/ai-tool-ref.d.ts.map +1 -0
- package/dist/src/ai-tool-ref.js +81 -0
- package/dist/src/ai-tool-ref.js.map +1 -0
- package/dist/src/authorizer.d.ts +18 -0
- package/dist/src/authorizer.d.ts.map +1 -0
- package/dist/src/authz/authz-tool-authorizer.d.ts +85 -0
- package/dist/src/authz/authz-tool-authorizer.d.ts.map +1 -0
- package/dist/src/authz/authz-tool-authorizer.js +63 -0
- package/dist/src/authz/authz-tool-authorizer.js.map +1 -0
- package/dist/src/authz/index.d.ts +3 -0
- package/dist/src/authz/index.d.ts.map +1 -0
- package/dist/src/authz/index.js +2 -0
- package/dist/src/authz/index.js.map +1 -0
- package/dist/src/data/data-tool.d.ts +64 -0
- package/dist/src/data/data-tool.d.ts.map +1 -0
- package/dist/src/data/data-tool.js +146 -0
- package/dist/src/data/data-tool.js.map +1 -0
- package/dist/src/data/index.d.ts +7 -0
- package/dist/src/data/index.d.ts.map +1 -0
- package/dist/src/data/index.js +7 -0
- package/dist/src/data/index.js.map +1 -0
- package/dist/src/data/limit.d.ts +12 -0
- package/dist/src/data/limit.d.ts.map +1 -0
- package/dist/src/data/limit.js +29 -0
- package/dist/src/data/limit.js.map +1 -0
- package/dist/src/data/parser.d.ts +27 -0
- package/dist/src/data/parser.d.ts.map +1 -0
- package/dist/src/data/parser.js +18 -0
- package/dist/src/data/parser.js.map +1 -0
- package/dist/src/data/sql-validator.d.ts +37 -0
- package/dist/src/data/sql-validator.d.ts.map +1 -0
- package/dist/src/data/sql-validator.js +92 -0
- package/dist/src/data/sql-validator.js.map +1 -0
- package/dist/src/data/table-access.d.ts +40 -0
- package/dist/src/data/table-access.d.ts.map +1 -0
- package/dist/src/data/table-access.js +41 -0
- package/dist/src/data/table-access.js.map +1 -0
- package/dist/src/data/tenant-scope.d.ts +39 -0
- package/dist/src/data/tenant-scope.d.ts.map +1 -0
- package/dist/src/data/tenant-scope.js +126 -0
- package/dist/src/data/tenant-scope.js.map +1 -0
- package/dist/src/define_config.d.ts +153 -0
- package/dist/src/define_config.d.ts.map +1 -0
- package/dist/src/define_config.js +7 -0
- package/dist/src/define_config.js.map +1 -0
- package/dist/src/diagnostics.d.ts +82 -0
- package/dist/src/diagnostics.d.ts.map +1 -0
- package/dist/src/diagnostics.js +50 -0
- package/dist/src/diagnostics.js.map +1 -0
- package/dist/src/durable/agent-run-context.d.ts +24 -0
- package/dist/src/durable/agent-run-context.d.ts.map +1 -0
- package/dist/src/durable/agent-run-context.js +17 -0
- package/dist/src/durable/agent-run-context.js.map +1 -0
- package/dist/src/durable/agent-run-workflow.d.ts +37 -0
- package/dist/src/durable/agent-run-workflow.d.ts.map +1 -0
- package/dist/src/durable/agent-run-workflow.js +128 -0
- package/dist/src/durable/agent-run-workflow.js.map +1 -0
- package/dist/src/durable/durable-agent-runner.d.ts +25 -0
- package/dist/src/durable/durable-agent-runner.d.ts.map +1 -0
- package/dist/src/durable/durable-agent-runner.js +59 -0
- package/dist/src/durable/durable-agent-runner.js.map +1 -0
- package/dist/src/durable/index.d.ts +17 -0
- package/dist/src/durable/index.d.ts.map +1 -0
- package/dist/src/durable/index.js +20 -0
- package/dist/src/durable/index.js.map +1 -0
- package/dist/src/index.d.ts +55 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +45 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/personas.d.ts +7 -0
- package/dist/src/personas.d.ts.map +1 -0
- package/dist/src/rag/chunk.d.ts +14 -0
- package/dist/src/rag/chunk.d.ts.map +1 -0
- package/dist/src/rag/chunk.js +42 -0
- package/dist/src/rag/chunk.js.map +1 -0
- package/dist/src/rag/embedding-retriever.d.ts +15 -0
- package/dist/src/rag/embedding-retriever.d.ts.map +1 -0
- package/dist/src/rag/embedding-retriever.js +24 -0
- package/dist/src/rag/embedding-retriever.js.map +1 -0
- package/dist/src/rag/filter.d.ts +6 -0
- package/dist/src/rag/filter.d.ts.map +1 -0
- package/dist/src/rag/filter.js +11 -0
- package/dist/src/rag/filter.js.map +1 -0
- package/dist/src/rag/index.d.ts +8 -0
- package/dist/src/rag/index.d.ts.map +1 -0
- package/dist/src/rag/index.js +8 -0
- package/dist/src/rag/index.js.map +1 -0
- package/dist/src/rag/ingest.d.ts +33 -0
- package/dist/src/rag/ingest.d.ts.map +1 -0
- package/dist/src/rag/ingest.js +37 -0
- package/dist/src/rag/ingest.js.map +1 -0
- package/dist/src/rag/memory-vector-store.d.ts +16 -0
- package/dist/src/rag/memory-vector-store.d.ts.map +1 -0
- package/dist/src/rag/memory-vector-store.js +70 -0
- package/dist/src/rag/memory-vector-store.js.map +1 -0
- package/dist/src/rag/pg-vector-store.d.ts +84 -0
- package/dist/src/rag/pg-vector-store.d.ts.map +1 -0
- package/dist/src/rag/pg-vector-store.js +220 -0
- package/dist/src/rag/pg-vector-store.js.map +1 -0
- package/dist/src/rag/vector-store.d.ts +47 -0
- package/dist/src/rag/vector-store.d.ts.map +1 -0
- package/dist/src/rag/vector-store.js +5 -0
- package/dist/src/rag/vector-store.js.map +1 -0
- package/dist/src/rag-media/diagnostics.d.ts +43 -0
- package/dist/src/rag-media/diagnostics.d.ts.map +1 -0
- package/dist/src/rag-media/diagnostics.js +36 -0
- package/dist/src/rag-media/diagnostics.js.map +1 -0
- package/dist/src/rag-media/index.d.ts +5 -0
- package/dist/src/rag-media/index.d.ts.map +1 -0
- package/dist/src/rag-media/index.js +5 -0
- package/dist/src/rag-media/index.js.map +1 -0
- package/dist/src/rag-media/media-events.d.ts +23 -0
- package/dist/src/rag-media/media-events.d.ts.map +1 -0
- package/dist/src/rag-media/media-events.js +28 -0
- package/dist/src/rag-media/media-events.js.map +1 -0
- package/dist/src/rag-media/media-rag-ingestion.d.ts +155 -0
- package/dist/src/rag-media/media-rag-ingestion.d.ts.map +1 -0
- package/dist/src/rag-media/media-rag-ingestion.js +204 -0
- package/dist/src/rag-media/media-rag-ingestion.js.map +1 -0
- package/dist/src/rag-media/text-extractor.d.ts +46 -0
- package/dist/src/rag-media/text-extractor.d.ts.map +1 -0
- package/dist/src/rag-media/text-extractor.js +92 -0
- package/dist/src/rag-media/text-extractor.js.map +1 -0
- package/dist/src/redis-stream-client.d.ts +29 -0
- package/dist/src/redis-stream-client.d.ts.map +1 -0
- package/dist/src/redis-stream-client.js +2 -0
- package/dist/src/redis-stream-client.js.map +1 -0
- package/dist/src/redis-token-stream-sink.d.ts +36 -0
- package/dist/src/redis-token-stream-sink.d.ts.map +1 -0
- package/dist/src/redis-token-stream-sink.js +94 -0
- package/dist/src/redis-token-stream-sink.js.map +1 -0
- package/dist/src/runners/inline-agent-runner.d.ts +26 -0
- package/dist/src/runners/inline-agent-runner.d.ts.map +1 -0
- package/dist/src/runners/inline-agent-runner.js +85 -0
- package/dist/src/runners/inline-agent-runner.js.map +1 -0
- package/dist/src/spi/actor-directory.d.ts +23 -0
- package/dist/src/spi/actor-directory.d.ts.map +1 -0
- package/dist/src/spi/actor-directory.js +2 -0
- package/dist/src/spi/actor-directory.js.map +1 -0
- package/dist/src/spi/actor-resolver.d.ts +18 -0
- package/dist/src/spi/actor-resolver.d.ts.map +1 -0
- package/dist/src/spi/agent-runner.d.ts +20 -0
- package/dist/src/spi/agent-runner.d.ts.map +1 -0
- package/dist/src/spi/agent-store.d.ts +104 -0
- package/dist/src/spi/agent-store.d.ts.map +1 -0
- package/dist/src/spi/agent-store.js +2 -0
- package/dist/src/spi/agent-store.js.map +1 -0
- package/dist/src/spi/attachment-staging.d.ts +27 -0
- package/dist/src/spi/attachment-staging.d.ts.map +1 -0
- package/dist/src/spi/attachment-staging.js +2 -0
- package/dist/src/spi/attachment-staging.js.map +1 -0
- package/dist/src/spi/embedding-provider.d.ts +12 -0
- package/dist/src/spi/embedding-provider.d.ts.map +1 -0
- package/dist/src/spi/embedding-provider.js +2 -0
- package/dist/src/spi/embedding-provider.js.map +1 -0
- package/dist/src/spi/governance-queries.d.ts +215 -0
- package/dist/src/spi/governance-queries.d.ts.map +1 -0
- package/dist/src/spi/governance-queries.js +15 -0
- package/dist/src/spi/governance-queries.js.map +1 -0
- package/dist/src/spi/model-provider.d.ts +41 -0
- package/dist/src/spi/model-provider.d.ts.map +1 -0
- package/dist/src/spi/pricing-store.d.ts +45 -0
- package/dist/src/spi/pricing-store.d.ts.map +1 -0
- package/dist/src/spi/pricing-store.js +24 -0
- package/dist/src/spi/pricing-store.js.map +1 -0
- package/dist/src/spi/quota-store.d.ts +7 -0
- package/dist/src/spi/quota-store.d.ts.map +1 -0
- package/dist/src/spi/reranker.d.ts +17 -0
- package/dist/src/spi/reranker.d.ts.map +1 -0
- package/dist/src/spi/reranker.js +2 -0
- package/dist/src/spi/reranker.js.map +1 -0
- package/dist/src/spi/retriever.d.ts +28 -0
- package/dist/src/spi/retriever.d.ts.map +1 -0
- package/dist/src/spi/retriever.js +11 -0
- package/dist/src/spi/retriever.js.map +1 -0
- package/dist/src/spi/roles-policy.d.ts +11 -0
- package/dist/src/spi/roles-policy.d.ts.map +1 -0
- package/dist/src/spi/tool.d.ts +21 -0
- package/dist/src/spi/tool.d.ts.map +1 -0
- package/dist/src/stores/factory.d.ts +363 -0
- package/dist/src/stores/factory.d.ts.map +1 -0
- package/dist/src/stores/factory.js +341 -0
- package/dist/src/stores/factory.js.map +1 -0
- package/dist/src/stores/ledger-quota.d.ts +23 -0
- package/dist/src/stores/ledger-quota.d.ts.map +1 -0
- package/dist/src/stores/ledger-quota.js +32 -0
- package/dist/src/stores/ledger-quota.js.map +1 -0
- package/dist/src/stores/lucid-governance-queries.d.ts +73 -0
- package/dist/src/stores/lucid-governance-queries.d.ts.map +1 -0
- package/dist/src/stores/lucid-governance-queries.js +510 -0
- package/dist/src/stores/lucid-governance-queries.js.map +1 -0
- package/dist/src/stores/lucid-pricing.d.ts +20 -0
- package/dist/src/stores/lucid-pricing.d.ts.map +1 -0
- package/dist/src/stores/lucid-pricing.js +67 -0
- package/dist/src/stores/lucid-pricing.js.map +1 -0
- package/dist/src/stores/lucid-schema.d.ts +37 -0
- package/dist/src/stores/lucid-schema.d.ts.map +1 -0
- package/dist/src/stores/lucid-schema.js +139 -0
- package/dist/src/stores/lucid-schema.js.map +1 -0
- package/dist/src/stores/lucid.d.ts +73 -0
- package/dist/src/stores/lucid.d.ts.map +1 -0
- package/dist/src/stores/lucid.js +400 -0
- package/dist/src/stores/lucid.js.map +1 -0
- package/dist/src/telescope/dashboard.d.ts +21 -0
- package/dist/src/telescope/dashboard.d.ts.map +1 -0
- package/dist/src/telescope/dashboard.js +140 -0
- package/dist/src/telescope/dashboard.js.map +1 -0
- package/dist/src/telescope/data-providers.d.ts +39 -0
- package/dist/src/telescope/data-providers.d.ts.map +1 -0
- package/dist/src/telescope/data-providers.js +345 -0
- package/dist/src/telescope/data-providers.js.map +1 -0
- package/dist/src/telescope/extension.d.ts +27 -0
- package/dist/src/telescope/extension.d.ts.map +1 -0
- package/dist/src/telescope/extension.js +45 -0
- package/dist/src/telescope/extension.js.map +1 -0
- package/dist/src/telescope/index.d.ts +5 -0
- package/dist/src/telescope/index.d.ts.map +1 -0
- package/dist/src/telescope/index.js +4 -0
- package/dist/src/telescope/index.js.map +1 -0
- package/dist/src/telescope/telescope-sdk.d.ts +126 -0
- package/dist/src/telescope/telescope-sdk.d.ts.map +1 -0
- package/dist/src/telescope/telescope-sdk.js +15 -0
- package/dist/src/telescope/telescope-sdk.js.map +1 -0
- package/dist/src/testing/fake-embedding-provider.d.ts +37 -0
- package/dist/src/testing/fake-embedding-provider.d.ts.map +1 -0
- package/dist/src/testing/fake-embedding-provider.js +67 -0
- package/dist/src/testing/fake-embedding-provider.js.map +1 -0
- package/dist/src/testing/fake-media.d.ts +44 -0
- package/dist/src/testing/fake-media.d.ts.map +1 -0
- package/dist/src/testing/fake-media.js +69 -0
- package/dist/src/testing/fake-media.js.map +1 -0
- package/dist/src/testing/fake-model-provider.d.ts +29 -0
- package/dist/src/testing/fake-model-provider.d.ts.map +1 -0
- package/dist/src/testing/in-memory-actor-directory.d.ts +14 -0
- package/dist/src/testing/in-memory-actor-directory.d.ts.map +1 -0
- package/dist/src/testing/in-memory-actor-directory.js +27 -0
- package/dist/src/testing/in-memory-actor-directory.js.map +1 -0
- package/dist/src/testing/in-memory-attachment-staging.d.ts +22 -0
- package/dist/src/testing/in-memory-attachment-staging.d.ts.map +1 -0
- package/dist/src/testing/in-memory-attachment-staging.js +28 -0
- package/dist/src/testing/in-memory-attachment-staging.js.map +1 -0
- package/dist/src/testing/in-memory-governance-queries.d.ts +34 -0
- package/dist/src/testing/in-memory-governance-queries.d.ts.map +1 -0
- package/dist/src/testing/in-memory-governance-queries.js +373 -0
- package/dist/src/testing/in-memory-governance-queries.js.map +1 -0
- package/dist/src/testing/in-memory-pricing.d.ts +13 -0
- package/dist/src/testing/in-memory-pricing.d.ts.map +1 -0
- package/dist/src/testing/in-memory-pricing.js +27 -0
- package/dist/src/testing/in-memory-pricing.js.map +1 -0
- package/dist/src/testing/in-memory-quota.d.ts +11 -0
- package/dist/src/testing/in-memory-quota.d.ts.map +1 -0
- package/dist/src/testing/in-memory-sink.d.ts +14 -0
- package/dist/src/testing/in-memory-sink.d.ts.map +1 -0
- package/dist/src/testing/in-memory-store.d.ts +119 -0
- package/dist/src/testing/in-memory-store.d.ts.map +1 -0
- package/dist/src/testing/in-memory-store.js +317 -0
- package/dist/src/testing/in-memory-store.js.map +1 -0
- package/dist/src/testing/index.d.ts +11 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/tool-discovery.d.ts +35 -0
- package/dist/src/tool-discovery.d.ts.map +1 -0
- package/dist/src/tool-registry.d.ts +45 -0
- package/dist/src/tool-registry.d.ts.map +1 -0
- package/dist/src/tool-retry.d.ts +56 -0
- package/dist/src/tool-retry.d.ts.map +1 -0
- package/dist/src/tool-retry.js +95 -0
- package/dist/src/tool-retry.js.map +1 -0
- package/dist/src/types.d.ts +222 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/stubs/config/agent.stub +55 -0
- package/dist/stubs/database/migrations/create_agent_rag_chunks.stub +41 -0
- package/dist/stubs/database/migrations/create_agent_run_tracking.stub +80 -0
- package/dist/stubs/database/migrations/create_agent_tables.stub +113 -0
- package/package.json +174 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
2
|
+
/** Who is driving the turn. Roles + tenant come from the host app (nestjs-context/authz). */
|
|
3
|
+
export interface Actor {
|
|
4
|
+
id: string;
|
|
5
|
+
/** The caller's roles. Tool authorization is a set intersection against a tool's `roles`. */
|
|
6
|
+
roles?: string[];
|
|
7
|
+
tenantRef?: string;
|
|
8
|
+
}
|
|
9
|
+
export type ToolKind = 'read' | 'action' | 'agent';
|
|
10
|
+
/**
|
|
11
|
+
* Declared shape of a tool.
|
|
12
|
+
* - `read` auto-executes.
|
|
13
|
+
* - `action` never auto-executes — requires HITL approval.
|
|
14
|
+
* - `agent` delegates to another named agent (durable: a child workflow; inline: a nested loop),
|
|
15
|
+
* handled at the loop level — NOT via a handler. Carries `targetAgent`.
|
|
16
|
+
*/
|
|
17
|
+
export interface ToolSpec {
|
|
18
|
+
name: string;
|
|
19
|
+
kind: ToolKind;
|
|
20
|
+
description: string;
|
|
21
|
+
/**
|
|
22
|
+
* Input schema as a [Standard Schema](https://standardschema.dev) — validation-agnostic, so
|
|
23
|
+
* Zod, Valibot, or ArkType all work. The loop validates input via `~standard.validate` before
|
|
24
|
+
* running the handler, and providers convert it to the model's tool-parameter JSON schema.
|
|
25
|
+
*/
|
|
26
|
+
inputSchema: StandardSchemaV1;
|
|
27
|
+
/** For `kind: 'agent'` — the name of the agent to delegate to. */
|
|
28
|
+
targetAgent?: string;
|
|
29
|
+
/** Roles allowed to invoke. Undefined → defaults applied by RolesPolicy (e.g. ADMIN-only). */
|
|
30
|
+
roles?: string[];
|
|
31
|
+
/**
|
|
32
|
+
* An authorization ability name (e.g. 'cache.purge'). Consumed by an ability-aware RolesPolicy
|
|
33
|
+
* such as the `@dudousxd/nestjs-agent-authz` Gate adapter. Apps that don't use authz ignore it
|
|
34
|
+
* and rely on `roles` instead — both live on the same SPI, so neither is required.
|
|
35
|
+
*/
|
|
36
|
+
ability?: string;
|
|
37
|
+
}
|
|
38
|
+
/** What the model is told a tool looks like (no handler, no host types). */
|
|
39
|
+
export interface ToolDefinition {
|
|
40
|
+
name: string;
|
|
41
|
+
kind: ToolKind;
|
|
42
|
+
description: string;
|
|
43
|
+
inputSchema: StandardSchemaV1;
|
|
44
|
+
}
|
|
45
|
+
/** A tool call the model asked for during a turn. */
|
|
46
|
+
export interface ToolCallRequest {
|
|
47
|
+
id: string;
|
|
48
|
+
name: string;
|
|
49
|
+
input: unknown;
|
|
50
|
+
}
|
|
51
|
+
/** Result of running a tool. */
|
|
52
|
+
export interface ToolResult {
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
output: unknown;
|
|
56
|
+
error?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface MessageUsage {
|
|
59
|
+
/**
|
|
60
|
+
* Total input (prompt) tokens for the turn — the whole input side, cached and uncached alike.
|
|
61
|
+
* `cacheWriteTokens` + `cacheReadTokens` are subsets of this count, not additions to it, so
|
|
62
|
+
* token totals and quota never change when a breakdown is present.
|
|
63
|
+
*/
|
|
64
|
+
inputTokens: number;
|
|
65
|
+
/** Total output (completion) tokens for the turn; `reasoningTokens` is a subset of this. */
|
|
66
|
+
outputTokens: number;
|
|
67
|
+
/**
|
|
68
|
+
* How many of `inputTokens` were written to the prompt cache this turn (billed at a premium,
|
|
69
|
+
* ~1.25× base input). Undefined when the provider doesn't report caching. Refines the cost
|
|
70
|
+
* estimate only — priced by the pricing row's cache-write rate (falling back to the input rate).
|
|
71
|
+
*/
|
|
72
|
+
cacheWriteTokens?: number;
|
|
73
|
+
/**
|
|
74
|
+
* How many of `inputTokens` were served from the prompt cache this turn (billed at a discount,
|
|
75
|
+
* ~0.1× base input). Undefined when the provider doesn't report caching.
|
|
76
|
+
*/
|
|
77
|
+
cacheReadTokens?: number;
|
|
78
|
+
/**
|
|
79
|
+
* How many of `outputTokens` the model spent on reasoning/thinking. Observability only — reasoning
|
|
80
|
+
* tokens are billed at the output rate, so they don't change the cost estimate. Undefined for
|
|
81
|
+
* non-reasoning models or providers that don't report it.
|
|
82
|
+
*/
|
|
83
|
+
reasoningTokens?: number;
|
|
84
|
+
/**
|
|
85
|
+
* This turn's USD cost: the provider's own reported figure when it has one (a gateway), else an
|
|
86
|
+
* estimate from the bound `AgentPricingStore` (cached once per run — see `AgentLoopDeps.pricingStore`),
|
|
87
|
+
* else `null` when no pricing store is bound or the model has no price row. Never `0` for an unpriced
|
|
88
|
+
* model — a real $0 turn and "we don't know" must stay distinguishable. Undefined before the loop
|
|
89
|
+
* folds cost (e.g. a plain usage struct that predates pricing).
|
|
90
|
+
*/
|
|
91
|
+
costUsd?: number | null;
|
|
92
|
+
}
|
|
93
|
+
export type UsagePurpose = 'chat' | 'title' | 'follow_ups' | 'summary';
|
|
94
|
+
export interface QuotaState {
|
|
95
|
+
usedTokens: number;
|
|
96
|
+
limitTokens: number;
|
|
97
|
+
withinLimit: boolean;
|
|
98
|
+
}
|
|
99
|
+
/** A human decision on a pending action tool call. */
|
|
100
|
+
export interface Decision {
|
|
101
|
+
approved: boolean;
|
|
102
|
+
reason?: string;
|
|
103
|
+
}
|
|
104
|
+
export type MessageRole = 'user' | 'assistant' | 'system';
|
|
105
|
+
/**
|
|
106
|
+
* A file a user attached to a message so a vision-capable model sees it natively (an image, a PDF).
|
|
107
|
+
* The lib stays provider-agnostic: it passes {@link MessageAttachment.url} straight through as the
|
|
108
|
+
* model's image/file part data — making that URL reachable by the provider (a presigned URL, a proxy,
|
|
109
|
+
* or a `data:` URI) is the consumer's job. The lib never fetches bytes or talks to a store; that
|
|
110
|
+
* upload-time work is the {@link import('./spi/attachment-staging.js').AttachmentStagingStore} seam.
|
|
111
|
+
*/
|
|
112
|
+
export interface MessageAttachment {
|
|
113
|
+
/** Stable id of the stored media object in the consumer's media store. Provenance + replay key. */
|
|
114
|
+
mediaId: string;
|
|
115
|
+
/** A URL the model provider can fetch the bytes from at turn time. */
|
|
116
|
+
url: string;
|
|
117
|
+
/** MIME type — routes the part: `image/*` → image part, otherwise → file part. */
|
|
118
|
+
contentType: string;
|
|
119
|
+
/** Original filename, for display and the file part's filename. */
|
|
120
|
+
name: string;
|
|
121
|
+
}
|
|
122
|
+
/** A neutral chat message exchanged with the model. */
|
|
123
|
+
export interface ModelMessage {
|
|
124
|
+
role: MessageRole;
|
|
125
|
+
content: string;
|
|
126
|
+
toolCalls?: ToolCallRequest[];
|
|
127
|
+
toolResults?: ToolResult[];
|
|
128
|
+
/** User-message attachments (image/PDF), rendered as native model content parts by the adapter. */
|
|
129
|
+
attachments?: MessageAttachment[];
|
|
130
|
+
}
|
|
131
|
+
export interface PageContext {
|
|
132
|
+
kind?: string;
|
|
133
|
+
[key: string]: unknown;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Inputs a {@link PromptBuilder} may use to compose the effective system prompt for a turn.
|
|
137
|
+
* `basePrompt` is the agent's own (already-resolved) base prompt, so a persona builder can wrap
|
|
138
|
+
* or extend it rather than replace it.
|
|
139
|
+
*/
|
|
140
|
+
export interface PromptContext {
|
|
141
|
+
actor: Actor;
|
|
142
|
+
persona?: Persona;
|
|
143
|
+
pageContext?: PageContext;
|
|
144
|
+
basePrompt: string;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* A dynamic system prompt. Return a string (optionally async) built from the turn's context —
|
|
148
|
+
* e.g. injecting the actor, the current page, or a data-shape description. The loop resolves it
|
|
149
|
+
* once per turn from stable inputs (actor/persona/pageContext), so it stays replay-safe.
|
|
150
|
+
*/
|
|
151
|
+
export type PromptBuilder = (ctx: PromptContext) => string | Promise<string>;
|
|
152
|
+
export interface Persona {
|
|
153
|
+
id: string;
|
|
154
|
+
label: string;
|
|
155
|
+
/** A flat prompt, or a {@link PromptBuilder} composed per request from {@link PromptContext}. */
|
|
156
|
+
systemPrompt: string | PromptBuilder;
|
|
157
|
+
/** If set, only these tool names are offered (after role filtering). */
|
|
158
|
+
allowedTools?: string[];
|
|
159
|
+
}
|
|
160
|
+
/** Everything needed to run one agent turn. */
|
|
161
|
+
export interface AgentRunInput {
|
|
162
|
+
threadId: string;
|
|
163
|
+
actor: Actor;
|
|
164
|
+
/** The latest user message text. */
|
|
165
|
+
userText: string;
|
|
166
|
+
/** Files attached to the latest user message (image/PDF). Persisted with it and sent to the model. */
|
|
167
|
+
attachments?: MessageAttachment[];
|
|
168
|
+
persona?: Persona;
|
|
169
|
+
pageContext?: PageContext;
|
|
170
|
+
isRegenerate?: boolean;
|
|
171
|
+
/** YYYY-MM-DD stamped by the runner so quota/day stays deterministic under durable replay. */
|
|
172
|
+
day?: string;
|
|
173
|
+
/** Which named agent runs this turn. Omitted → the default/single agent. */
|
|
174
|
+
agentName?: string;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* A named agent: its prompt, the tools it may use, and its personas. Multiple definitions are
|
|
178
|
+
* registered via `AgentModule.forFeature([...])`; an orchestrator delegates to others through
|
|
179
|
+
* `ctx.runAgent(name, task)`. Model/store/sink/governance are shared from the module unless
|
|
180
|
+
* overridden here.
|
|
181
|
+
*/
|
|
182
|
+
export interface AgentDefinition {
|
|
183
|
+
name: string;
|
|
184
|
+
/** Base prompt for this agent. A flat string, or a {@link PromptBuilder} resolved per turn. */
|
|
185
|
+
systemPrompt?: string | PromptBuilder;
|
|
186
|
+
/** Allow-list of tool names this agent may use (subset of all registered tools). */
|
|
187
|
+
tools?: string[];
|
|
188
|
+
/** Names of other agents this agent may delegate to (auto-registered as `agent`-kind tools). */
|
|
189
|
+
delegatesTo?: string[];
|
|
190
|
+
personas?: Persona[];
|
|
191
|
+
defaultPersona?: string;
|
|
192
|
+
modelId?: string;
|
|
193
|
+
maxSteps?: number;
|
|
194
|
+
}
|
|
195
|
+
export interface ThreadSummary {
|
|
196
|
+
id: string;
|
|
197
|
+
title: string;
|
|
198
|
+
persona: string;
|
|
199
|
+
pinnedAt?: string;
|
|
200
|
+
transient: boolean;
|
|
201
|
+
createdAt: string;
|
|
202
|
+
updatedAt: string;
|
|
203
|
+
lastMessagePreview?: string;
|
|
204
|
+
}
|
|
205
|
+
export interface StoredMessage {
|
|
206
|
+
id: string;
|
|
207
|
+
role: MessageRole;
|
|
208
|
+
content: string;
|
|
209
|
+
toolCalls?: ToolCallRequest[];
|
|
210
|
+
toolResults?: ToolResult[];
|
|
211
|
+
/** Files the user attached to this message (image/PDF). Persisted with the message, replayed as-is. */
|
|
212
|
+
attachments?: MessageAttachment[];
|
|
213
|
+
followUps?: string[];
|
|
214
|
+
usage?: MessageUsage;
|
|
215
|
+
createdAt: string;
|
|
216
|
+
}
|
|
217
|
+
export interface ThreadDetail extends ThreadSummary {
|
|
218
|
+
messages: StoredMessage[];
|
|
219
|
+
activeStreamId?: string;
|
|
220
|
+
}
|
|
221
|
+
export type ToolCallStatus = 'auto_executed' | 'pending_approval' | 'executed' | 'rejected' | 'failed';
|
|
222
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{{{
|
|
2
|
+
exports({ to: app.configPath('agent.ts') })
|
|
3
|
+
}}}
|
|
4
|
+
import { defineConfig, stores, AuthActorResolver } from '@adonis-agora/agent'
|
|
5
|
+
// import { attachmentStores } from '@adonis-agora/agent'
|
|
6
|
+
// import { aiSdkModel } from '@adonis-agora/agent/ai-sdk'
|
|
7
|
+
// import { openai } from '@ai-sdk/openai'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Configuration for @adonis-agora/agent. Only `model` is required. Pick a `store` by name from the
|
|
11
|
+
* `stores` map (each driver's peer is imported lazily, only when selected); omit `store` for the
|
|
12
|
+
* in-memory store. The runner is in-process by default (`durable` is deferred). The actor resolver
|
|
13
|
+
* defaults to one that THROWS — the agent never fabricates a caller — so wire a real one.
|
|
14
|
+
*
|
|
15
|
+
* Publish the tables with `node ace migration:run` after configuring.
|
|
16
|
+
*/
|
|
17
|
+
export default defineConfig({
|
|
18
|
+
/**
|
|
19
|
+
* The LLM provider. Wrap the Vercel AI SDK via `aiSdkModel(...)` (from `@adonis-agora/agent/ai-sdk`)
|
|
20
|
+
* or supply any `ModelProvider`. A lazy thunk keeps the provider SDK peer imported only at boot:
|
|
21
|
+
*
|
|
22
|
+
* model: () => aiSdkModel({ model: openai('gpt-4o-mini') }),
|
|
23
|
+
*/
|
|
24
|
+
model: () => {
|
|
25
|
+
throw new Error('Configure a model in config/agent.ts (e.g. aiSdkModel({ model: ... }))')
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
store: 'lucid',
|
|
29
|
+
stores: {
|
|
30
|
+
memory: stores.memory(),
|
|
31
|
+
lucid: stores.lucid(),
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
// Identity seam — reads ctx.auth.user (fail-closed: throws when unauthenticated). Swap for your own
|
|
35
|
+
// resolver, or HeaderActorResolver behind a trusted gateway.
|
|
36
|
+
actorResolver: new AuthActorResolver(),
|
|
37
|
+
|
|
38
|
+
// path: 'agent', // → /agent/chat, /agent/threads, ...
|
|
39
|
+
// defaultRoles: ['ADMIN'], // roles a tool requires when it declares none (fail-closed)
|
|
40
|
+
// maxSteps: 8, // cap on model↔tool iterations per turn
|
|
41
|
+
|
|
42
|
+
// Multimodal uploads — mounts POST /agent/attachments, which stages a file into a model-fetchable
|
|
43
|
+
// MessageAttachment the client sends back with its next chat message. Bind your own store (presign
|
|
44
|
+
// S3/GCS or wrap your media pipeline); `attachmentStores.memory()` inlines bytes as a data: URL.
|
|
45
|
+
// attachmentStaging: attachmentStores.memory(),
|
|
46
|
+
// attachmentMaxBytes: 20 * 1024 * 1024,
|
|
47
|
+
// attachmentAllowedContentTypes: ['image/png', 'image/jpeg', 'application/pdf'],
|
|
48
|
+
|
|
49
|
+
// The implicit default agent (base prompt, personas, tool allow-list). Omit for a bare assistant.
|
|
50
|
+
// defaultAgent: {
|
|
51
|
+
// systemPrompt: 'You are a helpful assistant.',
|
|
52
|
+
// personas: [{ id: 'default', label: 'Default', systemPrompt: 'You are a helpful assistant.' }],
|
|
53
|
+
// defaultPersona: 'default',
|
|
54
|
+
// },
|
|
55
|
+
})
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{{{
|
|
2
|
+
exports({ to: app.migrationsPath(`${new Date().getTime()}_create_agent_rag_chunks.ts`) })
|
|
3
|
+
}}}
|
|
4
|
+
import { BaseSchema } from '@adonisjs/lucid/schema'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The pgvector chunk table for the @adonis-agora/agent `retrievers.pgvector({...})` store: one row per
|
|
8
|
+
* embedded chunk (id `${documentId}#<n>`), the chunk text, an optional citation source, a `jsonb`
|
|
9
|
+
* metadata column filtered with `@>`, and the `vector(N)` embedding ranked with the `<=>`/`<->`/`<#>`
|
|
10
|
+
* operators. Requires the pgvector extension (`CREATE EXTENSION vector`) — Postgres only.
|
|
11
|
+
*
|
|
12
|
+
* Set `DIMENSION` to your embedding model's width (e.g. 1536 for text-embedding-3-small) and `OPCLASS`
|
|
13
|
+
* to the index operator class matching the store's metric: `vector_cosine_ops` (default),
|
|
14
|
+
* `vector_l2_ops`, or `vector_ip_ops`.
|
|
15
|
+
*/
|
|
16
|
+
const TABLE = 'agent_rag_chunks'
|
|
17
|
+
const DIMENSION = 1536
|
|
18
|
+
const OPCLASS = 'vector_cosine_ops'
|
|
19
|
+
|
|
20
|
+
export default class extends BaseSchema {
|
|
21
|
+
async up() {
|
|
22
|
+
this.schema.raw('CREATE EXTENSION IF NOT EXISTS vector')
|
|
23
|
+
|
|
24
|
+
this.schema.createTable(TABLE, (table) => {
|
|
25
|
+
table.text('id').primary()
|
|
26
|
+
table.text('text').notNullable()
|
|
27
|
+
table.text('source')
|
|
28
|
+
table.jsonb('metadata')
|
|
29
|
+
table.specificType('embedding', `vector(${DIMENSION})`).notNullable()
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
// Approximate-nearest-neighbour index for the configured metric. Drop it to fall back to an exact scan.
|
|
33
|
+
this.schema.raw(
|
|
34
|
+
`CREATE INDEX IF NOT EXISTS ${TABLE}_embedding_idx ON ${TABLE} USING hnsw (embedding ${OPCLASS})`
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async down() {
|
|
39
|
+
this.schema.dropTableIfExists(TABLE)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{{{
|
|
2
|
+
exports({ to: app.migrationsPath(`${new Date().getTime()}_create_agent_run_tracking.ts`) })
|
|
3
|
+
}}}
|
|
4
|
+
import { BaseSchema } from '@adonisjs/lucid/schema'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Additive migration for @adonis-agora/agent RUN tracking. Adds the `agent_run` table (one row per
|
|
8
|
+
* run/turn lifecycle) plus a nullable `run_id` correlation column on `agent_message`,
|
|
9
|
+
* `agent_tool_call` and `agent_token_usage`. `run_id` is deliberately NOT a DB foreign key (like the
|
|
10
|
+
* reference): it can be `ALTER TABLE ADD COLUMN`-ed portably (SQLite can't add a column WITH a FK
|
|
11
|
+
* constraint) and a row written before this shipped keeps a `null` run_id.
|
|
12
|
+
*
|
|
13
|
+
* Timestamps are epoch-ms integers, booleans INTEGER (0/1) and cost a DOUBLE, matching
|
|
14
|
+
* `create_agent_tables` so the schema stays portable across SQLite / Postgres / MySQL. Safe to run on
|
|
15
|
+
* an existing deployment: it only creates a new table and adds nullable columns.
|
|
16
|
+
*/
|
|
17
|
+
export default class extends BaseSchema {
|
|
18
|
+
async up() {
|
|
19
|
+
this.schema.createTable('agent_run', (table) => {
|
|
20
|
+
table.string('id').primary()
|
|
21
|
+
table
|
|
22
|
+
.string('thread_id')
|
|
23
|
+
.notNullable()
|
|
24
|
+
.references('id')
|
|
25
|
+
.inTable('agent_thread')
|
|
26
|
+
.onDelete('CASCADE')
|
|
27
|
+
table.string('agent_name')
|
|
28
|
+
table.string('actor_ref').notNullable()
|
|
29
|
+
table.string('tenant_ref')
|
|
30
|
+
table.string('status').notNullable()
|
|
31
|
+
table.bigInteger('started_at').notNullable()
|
|
32
|
+
table.bigInteger('finished_at')
|
|
33
|
+
table.integer('step_count').notNullable().defaultTo(0)
|
|
34
|
+
table.integer('input_tokens').notNullable().defaultTo(0)
|
|
35
|
+
table.integer('output_tokens').notNullable().defaultTo(0)
|
|
36
|
+
table.double('cost_usd')
|
|
37
|
+
table.text('error')
|
|
38
|
+
table.integer('durable').notNullable().defaultTo(0)
|
|
39
|
+
table.index(['started_at'], 'agent_run_started_idx')
|
|
40
|
+
table.index(['actor_ref', 'started_at'], 'agent_run_actor_started_idx')
|
|
41
|
+
table.index(['status', 'started_at'], 'agent_run_status_started_idx')
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
this.schema.alterTable('agent_message', (table) => {
|
|
45
|
+
table.string('run_id')
|
|
46
|
+
table.index(['run_id'], 'agent_message_run_idx')
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
this.schema.alterTable('agent_tool_call', (table) => {
|
|
50
|
+
table.string('run_id')
|
|
51
|
+
table.index(['run_id'], 'agent_tool_call_run_idx')
|
|
52
|
+
table.index(['status', 'created_at'], 'agent_tool_call_status_created_idx')
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
this.schema.alterTable('agent_token_usage', (table) => {
|
|
56
|
+
table.string('run_id')
|
|
57
|
+
table.index(['run_id'], 'agent_token_usage_run_idx')
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async down() {
|
|
62
|
+
this.schema.alterTable('agent_token_usage', (table) => {
|
|
63
|
+
table.dropIndex(['run_id'], 'agent_token_usage_run_idx')
|
|
64
|
+
table.dropColumn('run_id')
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
this.schema.alterTable('agent_tool_call', (table) => {
|
|
68
|
+
table.dropIndex(['status', 'created_at'], 'agent_tool_call_status_created_idx')
|
|
69
|
+
table.dropIndex(['run_id'], 'agent_tool_call_run_idx')
|
|
70
|
+
table.dropColumn('run_id')
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
this.schema.alterTable('agent_message', (table) => {
|
|
74
|
+
table.dropIndex(['run_id'], 'agent_message_run_idx')
|
|
75
|
+
table.dropColumn('run_id')
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
this.schema.dropTableIfExists('agent_run')
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
{{{
|
|
2
|
+
exports({ to: app.migrationsPath(`${new Date().getTime()}_create_agent_tables.ts`) })
|
|
3
|
+
}}}
|
|
4
|
+
import { BaseSchema } from '@adonisjs/lucid/schema'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The five tables for the @adonis-agora/agent `lucid` store: threads, messages, tool calls, token
|
|
8
|
+
* usage and model pricing. JSON payloads (tool calls/results, follow-ups, usage, tool input/output)
|
|
9
|
+
* are stored as TEXT — the store (de)serializes them — booleans as INTEGER (0/1), and timestamps as
|
|
10
|
+
* epoch-ms integers, so the schema is portable across SQLite / Postgres / MySQL. The `agent_tool_call`
|
|
11
|
+
* primary key is the model-supplied `toolCallId`, not a generated id.
|
|
12
|
+
*/
|
|
13
|
+
export default class extends BaseSchema {
|
|
14
|
+
async up() {
|
|
15
|
+
this.schema.createTable('agent_thread', (table) => {
|
|
16
|
+
table.string('id').primary()
|
|
17
|
+
table.string('actor_ref').notNullable()
|
|
18
|
+
table.string('tenant_ref')
|
|
19
|
+
table.text('title').notNullable()
|
|
20
|
+
table.string('persona').notNullable().defaultTo('default')
|
|
21
|
+
table.integer('transient').notNullable().defaultTo(0)
|
|
22
|
+
table.bigInteger('pinned_at')
|
|
23
|
+
table.text('summary')
|
|
24
|
+
table.integer('summary_message_count').notNullable().defaultTo(0)
|
|
25
|
+
table.string('active_stream_id')
|
|
26
|
+
table.bigInteger('created_at').notNullable()
|
|
27
|
+
table.bigInteger('updated_at').notNullable()
|
|
28
|
+
table.bigInteger('deleted_at')
|
|
29
|
+
table.index(['actor_ref', 'updated_at'], 'agent_thread_actor_updated_idx')
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
this.schema.createTable('agent_message', (table) => {
|
|
33
|
+
table.string('id').primary()
|
|
34
|
+
table
|
|
35
|
+
.string('thread_id')
|
|
36
|
+
.notNullable()
|
|
37
|
+
.references('id')
|
|
38
|
+
.inTable('agent_thread')
|
|
39
|
+
.onDelete('CASCADE')
|
|
40
|
+
table.string('role').notNullable()
|
|
41
|
+
table.text('content').notNullable()
|
|
42
|
+
table.text('tool_calls')
|
|
43
|
+
table.text('tool_results')
|
|
44
|
+
table.text('attachments')
|
|
45
|
+
table.text('follow_ups')
|
|
46
|
+
table.text('usage')
|
|
47
|
+
table.string('persona')
|
|
48
|
+
table.bigInteger('created_at').notNullable()
|
|
49
|
+
table.index(['thread_id', 'created_at'], 'agent_message_thread_created_idx')
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
this.schema.createTable('agent_tool_call', (table) => {
|
|
53
|
+
// PK = the model-supplied toolCallId, not a generated id.
|
|
54
|
+
table.string('id').primary()
|
|
55
|
+
table
|
|
56
|
+
.string('message_id')
|
|
57
|
+
.notNullable()
|
|
58
|
+
.references('id')
|
|
59
|
+
.inTable('agent_message')
|
|
60
|
+
.onDelete('CASCADE')
|
|
61
|
+
table.string('tool_name').notNullable()
|
|
62
|
+
table.string('tool_type').notNullable()
|
|
63
|
+
table.text('input')
|
|
64
|
+
table.text('output')
|
|
65
|
+
table.string('status').notNullable()
|
|
66
|
+
table.string('executed_by_ref')
|
|
67
|
+
table.integer('execution_ms')
|
|
68
|
+
table.text('error')
|
|
69
|
+
table.bigInteger('created_at').notNullable()
|
|
70
|
+
table.bigInteger('executed_at')
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
this.schema.createTable('agent_token_usage', (table) => {
|
|
74
|
+
table.string('id').primary()
|
|
75
|
+
table
|
|
76
|
+
.string('thread_id')
|
|
77
|
+
.notNullable()
|
|
78
|
+
.references('id')
|
|
79
|
+
.inTable('agent_thread')
|
|
80
|
+
.onDelete('CASCADE')
|
|
81
|
+
table.string('actor_ref').notNullable()
|
|
82
|
+
table.string('message_id')
|
|
83
|
+
table.string('model_id').notNullable()
|
|
84
|
+
table.string('purpose').notNullable()
|
|
85
|
+
table.integer('input_tokens').notNullable()
|
|
86
|
+
table.integer('output_tokens').notNullable()
|
|
87
|
+
table.integer('cache_write_tokens')
|
|
88
|
+
table.integer('cache_read_tokens')
|
|
89
|
+
table.double('cost_usd')
|
|
90
|
+
table.bigInteger('created_at').notNullable()
|
|
91
|
+
table.index(['actor_ref', 'created_at'], 'agent_token_usage_actor_created_idx')
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
this.schema.createTable('agent_model_pricing', (table) => {
|
|
95
|
+
table.string('id').primary()
|
|
96
|
+
table.string('model_id').notNullable()
|
|
97
|
+
table.double('input_price_per_1m').notNullable()
|
|
98
|
+
table.double('output_price_per_1m').notNullable()
|
|
99
|
+
table.double('cache_write_price_per_1m')
|
|
100
|
+
table.double('cache_read_price_per_1m')
|
|
101
|
+
table.bigInteger('effective_from').notNullable()
|
|
102
|
+
table.integer('is_current').notNullable()
|
|
103
|
+
})
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async down() {
|
|
107
|
+
this.schema.dropTableIfExists('agent_model_pricing')
|
|
108
|
+
this.schema.dropTableIfExists('agent_token_usage')
|
|
109
|
+
this.schema.dropTableIfExists('agent_tool_call')
|
|
110
|
+
this.schema.dropTableIfExists('agent_message')
|
|
111
|
+
this.schema.dropTableIfExists('agent_thread')
|
|
112
|
+
}
|
|
113
|
+
}
|