bopodev-api 0.1.25 → 0.1.27
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/README.md +44 -0
- package/package.json +4 -4
- package/src/lib/run-artifact-paths.ts +80 -0
- package/src/pricing/anthropic.ts +23 -0
- package/src/pricing/gemini.ts +11 -0
- package/src/pricing/index.ts +29 -0
- package/src/pricing/openai.ts +47 -0
- package/src/pricing/opencode.ts +5 -0
- package/src/pricing/types.ts +8 -0
- package/src/routes/companies.ts +0 -2
- package/src/routes/governance.ts +80 -2
- package/src/routes/issues.ts +16 -1
- package/src/routes/observability.ts +79 -64
- package/src/scripts/onboard-seed.ts +6 -9
- package/src/server.ts +89 -3
- package/src/services/attention-service.ts +109 -48
- package/src/services/governance-service.ts +5 -5
- package/src/services/heartbeat-service.ts +1350 -86
- package/src/services/memory-file-service.ts +0 -3
- package/src/services/model-pricing.ts +4 -128
|
@@ -74,9 +74,6 @@ export async function loadAgentMemoryContext(input: {
|
|
|
74
74
|
label: "agent"
|
|
75
75
|
}
|
|
76
76
|
];
|
|
77
|
-
for (const source of scopedRoots) {
|
|
78
|
-
await ensureMemoryDirs(source.root, join(source.root, "life"), join(source.root, "memory"));
|
|
79
|
-
}
|
|
80
77
|
const tacitBlocks = await Promise.all(
|
|
81
78
|
scopedRoots.map(async (source) => {
|
|
82
79
|
const tacit = await readTacitNotes(source.root);
|
|
@@ -1,129 +1,6 @@
|
|
|
1
1
|
import type { BopoDb } from "bopodev-db";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
type SeedModelPricingRow = {
|
|
5
|
-
providerType: "openai_api" | "anthropic_api" | "gemini_api";
|
|
6
|
-
modelId: string;
|
|
7
|
-
displayName: string;
|
|
8
|
-
inputUsdPer1M: number;
|
|
9
|
-
outputUsdPer1M: number;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
const OPENAI_MODEL_BASE_PRICES: Array<{
|
|
13
|
-
modelId: string;
|
|
14
|
-
displayName: string;
|
|
15
|
-
inputUsdPer1M: number;
|
|
16
|
-
outputUsdPer1M: number;
|
|
17
|
-
}> = [
|
|
18
|
-
{ modelId: "gpt-5.2", displayName: "GPT-5.2", inputUsdPer1M: 1.75, outputUsdPer1M: 14 },
|
|
19
|
-
{ modelId: "gpt-5.1", displayName: "GPT-5.1", inputUsdPer1M: 1.25, outputUsdPer1M: 10 },
|
|
20
|
-
{ modelId: "gpt-5", displayName: "GPT-5", inputUsdPer1M: 1.25, outputUsdPer1M: 10 },
|
|
21
|
-
{ modelId: "gpt-5-mini", displayName: "GPT-5 Mini", inputUsdPer1M: 0.25, outputUsdPer1M: 2 },
|
|
22
|
-
{ modelId: "gpt-5-nano", displayName: "GPT-5 Nano", inputUsdPer1M: 0.05, outputUsdPer1M: 0.4 },
|
|
23
|
-
{ modelId: "gpt-5.3-chat-latest", displayName: "GPT-5.3 Chat Latest", inputUsdPer1M: 1.75, outputUsdPer1M: 14 },
|
|
24
|
-
{ modelId: "gpt-5.2-chat-latest", displayName: "GPT-5.2 Chat Latest", inputUsdPer1M: 1.75, outputUsdPer1M: 14 },
|
|
25
|
-
{ modelId: "gpt-5.1-chat-latest", displayName: "GPT-5.1 Chat Latest", inputUsdPer1M: 1.25, outputUsdPer1M: 10 },
|
|
26
|
-
{ modelId: "gpt-5-chat-latest", displayName: "GPT-5 Chat Latest", inputUsdPer1M: 1.25, outputUsdPer1M: 10 },
|
|
27
|
-
{ modelId: "gpt-5.4", displayName: "GPT-5.4", inputUsdPer1M: 1.75, outputUsdPer1M: 14 },
|
|
28
|
-
{ modelId: "gpt-5.3-codex", displayName: "GPT-5.3 Codex", inputUsdPer1M: 1.75, outputUsdPer1M: 14 },
|
|
29
|
-
{ modelId: "gpt-5.3-codex-spark", displayName: "GPT-5.3 Codex Spark", inputUsdPer1M: 1.75, outputUsdPer1M: 14 },
|
|
30
|
-
{ modelId: "gpt-5.2-codex", displayName: "GPT-5.2 Codex", inputUsdPer1M: 1.75, outputUsdPer1M: 14 },
|
|
31
|
-
{ modelId: "gpt-5.1-codex-max", displayName: "GPT-5.1 Codex Max", inputUsdPer1M: 1.25, outputUsdPer1M: 10 },
|
|
32
|
-
{ modelId: "gpt-5.1-codex-mini", displayName: "GPT-5.1 Codex Mini", inputUsdPer1M: 0.25, outputUsdPer1M: 2 },
|
|
33
|
-
{ modelId: "gpt-5.1-codex", displayName: "GPT-5.1 Codex", inputUsdPer1M: 1.25, outputUsdPer1M: 10 },
|
|
34
|
-
{ modelId: "gpt-5-codex", displayName: "GPT-5 Codex", inputUsdPer1M: 1.25, outputUsdPer1M: 10 },
|
|
35
|
-
{ modelId: "gpt-5.2-pro", displayName: "GPT-5.2 Pro", inputUsdPer1M: 21, outputUsdPer1M: 168 },
|
|
36
|
-
{ modelId: "gpt-5-pro", displayName: "GPT-5 Pro", inputUsdPer1M: 15, outputUsdPer1M: 120 },
|
|
37
|
-
{ modelId: "gpt-4.1", displayName: "GPT-4.1", inputUsdPer1M: 2, outputUsdPer1M: 8 },
|
|
38
|
-
{ modelId: "gpt-4.1-mini", displayName: "GPT-4.1 Mini", inputUsdPer1M: 0.4, outputUsdPer1M: 1.6 },
|
|
39
|
-
{ modelId: "gpt-4.1-nano", displayName: "GPT-4.1 Nano", inputUsdPer1M: 0.1, outputUsdPer1M: 0.4 },
|
|
40
|
-
{ modelId: "gpt-4o", displayName: "GPT-4o", inputUsdPer1M: 2.5, outputUsdPer1M: 10 },
|
|
41
|
-
{ modelId: "gpt-4o-2024-05-13", displayName: "GPT-4o 2024-05-13", inputUsdPer1M: 5, outputUsdPer1M: 15 },
|
|
42
|
-
{ modelId: "gpt-4o-mini", displayName: "GPT-4o Mini", inputUsdPer1M: 0.15, outputUsdPer1M: 0.6 },
|
|
43
|
-
{ modelId: "gpt-realtime", displayName: "GPT Realtime", inputUsdPer1M: 4, outputUsdPer1M: 16 },
|
|
44
|
-
{ modelId: "gpt-realtime-1.5", displayName: "GPT Realtime 1.5", inputUsdPer1M: 4, outputUsdPer1M: 16 },
|
|
45
|
-
{ modelId: "gpt-realtime-mini", displayName: "GPT Realtime Mini", inputUsdPer1M: 0.6, outputUsdPer1M: 2.4 },
|
|
46
|
-
{ modelId: "gpt-4o-realtime-preview", displayName: "GPT-4o Realtime Preview", inputUsdPer1M: 5, outputUsdPer1M: 20 },
|
|
47
|
-
{ modelId: "gpt-4o-mini-realtime-preview", displayName: "GPT-4o Mini Realtime Preview", inputUsdPer1M: 0.6, outputUsdPer1M: 2.4 },
|
|
48
|
-
{ modelId: "gpt-audio", displayName: "GPT Audio", inputUsdPer1M: 2.5, outputUsdPer1M: 10 },
|
|
49
|
-
{ modelId: "gpt-audio-1.5", displayName: "GPT Audio 1.5", inputUsdPer1M: 2.5, outputUsdPer1M: 10 },
|
|
50
|
-
{ modelId: "gpt-audio-mini", displayName: "GPT Audio Mini", inputUsdPer1M: 0.6, outputUsdPer1M: 2.4 },
|
|
51
|
-
{ modelId: "gpt-4o-audio-preview", displayName: "GPT-4o Audio Preview", inputUsdPer1M: 2.5, outputUsdPer1M: 10 },
|
|
52
|
-
{ modelId: "gpt-4o-mini-audio-preview", displayName: "GPT-4o Mini Audio Preview", inputUsdPer1M: 0.15, outputUsdPer1M: 0.6 },
|
|
53
|
-
{ modelId: "o1", displayName: "o1", inputUsdPer1M: 15, outputUsdPer1M: 60 },
|
|
54
|
-
{ modelId: "o1-pro", displayName: "o1-pro", inputUsdPer1M: 150, outputUsdPer1M: 600 },
|
|
55
|
-
{ modelId: "o3-pro", displayName: "o3-pro", inputUsdPer1M: 20, outputUsdPer1M: 80 },
|
|
56
|
-
{ modelId: "o3", displayName: "o3", inputUsdPer1M: 2, outputUsdPer1M: 8 },
|
|
57
|
-
{ modelId: "o3-deep-research", displayName: "o3 Deep Research", inputUsdPer1M: 10, outputUsdPer1M: 40 },
|
|
58
|
-
{ modelId: "o4-mini", displayName: "o4-mini", inputUsdPer1M: 1.1, outputUsdPer1M: 4.4 },
|
|
59
|
-
{ modelId: "o4-mini-deep-research", displayName: "o4-mini Deep Research", inputUsdPer1M: 2, outputUsdPer1M: 8 },
|
|
60
|
-
{ modelId: "o3-mini", displayName: "o3-mini", inputUsdPer1M: 1.1, outputUsdPer1M: 4.4 }
|
|
61
|
-
];
|
|
62
|
-
|
|
63
|
-
const CLAUDE_MODEL_BASE_PRICES: Array<{
|
|
64
|
-
modelId: string;
|
|
65
|
-
displayName: string;
|
|
66
|
-
inputUsdPer1M: number;
|
|
67
|
-
outputUsdPer1M: number;
|
|
68
|
-
}> = [
|
|
69
|
-
// Runtime ids currently used in provider model selectors.
|
|
70
|
-
{ modelId: "claude-opus-4-6", displayName: "Claude Opus 4.6", inputUsdPer1M: 5, outputUsdPer1M: 25 },
|
|
71
|
-
{ modelId: "claude-sonnet-4-6", displayName: "Claude Sonnet 4.6", inputUsdPer1M: 3, outputUsdPer1M: 15 },
|
|
72
|
-
{ modelId: "claude-sonnet-4-6-1m", displayName: "Claude Sonnet 4.6 (1M context)", inputUsdPer1M: 6, outputUsdPer1M: 22.5 },
|
|
73
|
-
{ modelId: "claude-opus-4-6-1m", displayName: "Claude Opus 4.6 (1M context)", inputUsdPer1M: 10, outputUsdPer1M: 37.5 },
|
|
74
|
-
{ modelId: "claude-haiku-4-5", displayName: "Claude Haiku 4.5", inputUsdPer1M: 1, outputUsdPer1M: 5 },
|
|
75
|
-
// Legacy / alternate ids
|
|
76
|
-
{ modelId: "claude-sonnet-4-5-20250929", displayName: "Claude Sonnet 4.5", inputUsdPer1M: 3, outputUsdPer1M: 15 },
|
|
77
|
-
{ modelId: "claude-haiku-4-5-20251001", displayName: "Claude Haiku 4.5", inputUsdPer1M: 1, outputUsdPer1M: 5 },
|
|
78
|
-
{ modelId: "claude-opus-4.6", displayName: "Claude Opus 4.6", inputUsdPer1M: 5, outputUsdPer1M: 25 },
|
|
79
|
-
{ modelId: "claude-opus-4.5", displayName: "Claude Opus 4.5", inputUsdPer1M: 5, outputUsdPer1M: 25 },
|
|
80
|
-
{ modelId: "claude-opus-4.1", displayName: "Claude Opus 4.1", inputUsdPer1M: 15, outputUsdPer1M: 75 },
|
|
81
|
-
{ modelId: "claude-opus-4", displayName: "Claude Opus 4", inputUsdPer1M: 15, outputUsdPer1M: 75 },
|
|
82
|
-
{ modelId: "claude-sonnet-4.6", displayName: "Claude Sonnet 4.6", inputUsdPer1M: 3, outputUsdPer1M: 15 },
|
|
83
|
-
{ modelId: "claude-sonnet-4.5", displayName: "Claude Sonnet 4.5", inputUsdPer1M: 3, outputUsdPer1M: 15 },
|
|
84
|
-
{ modelId: "claude-sonnet-4", displayName: "Claude Sonnet 4", inputUsdPer1M: 3, outputUsdPer1M: 15 },
|
|
85
|
-
{ modelId: "claude-sonnet-3.7", displayName: "Claude Sonnet 3.7", inputUsdPer1M: 3, outputUsdPer1M: 15 },
|
|
86
|
-
{ modelId: "claude-haiku-4.5", displayName: "Claude Haiku 4.5", inputUsdPer1M: 1, outputUsdPer1M: 5 },
|
|
87
|
-
{ modelId: "claude-haiku-3.5", displayName: "Claude Haiku 3.5", inputUsdPer1M: 0.8, outputUsdPer1M: 4 },
|
|
88
|
-
{ modelId: "claude-opus-3", displayName: "Claude Opus 3", inputUsdPer1M: 15, outputUsdPer1M: 75 },
|
|
89
|
-
{ modelId: "claude-haiku-3", displayName: "Claude Haiku 3", inputUsdPer1M: 0.25, outputUsdPer1M: 1.25 }
|
|
90
|
-
];
|
|
91
|
-
|
|
92
|
-
const GEMINI_MODEL_BASE_PRICES: Array<{
|
|
93
|
-
modelId: string;
|
|
94
|
-
displayName: string;
|
|
95
|
-
inputUsdPer1M: number;
|
|
96
|
-
outputUsdPer1M: number;
|
|
97
|
-
}> = [
|
|
98
|
-
{ modelId: "gemini-3.1-flash-lite", displayName: "Gemini 3.1 Flash Lite", inputUsdPer1M: 0.25, outputUsdPer1M: 1.5 },
|
|
99
|
-
{ modelId: "gemini-3-flash", displayName: "Gemini 3 Flash", inputUsdPer1M: 0.5, outputUsdPer1M: 3 },
|
|
100
|
-
{ modelId: "gemini-3-pro", displayName: "Gemini 3 Pro", inputUsdPer1M: 2, outputUsdPer1M: 12 },
|
|
101
|
-
{ modelId: "gemini-3-pro-200k", displayName: "Gemini 3 Pro (>200k context)", inputUsdPer1M: 4, outputUsdPer1M: 18 },
|
|
102
|
-
{ modelId: "gemini-2.5-flash-lite", displayName: "Gemini 2.5 Flash Lite", inputUsdPer1M: 0.1, outputUsdPer1M: 0.4 },
|
|
103
|
-
{ modelId: "gemini-2.5-flash", displayName: "Gemini 2.5 Flash", inputUsdPer1M: 0.3, outputUsdPer1M: 2.5 },
|
|
104
|
-
{ modelId: "gemini-2.5-pro", displayName: "Gemini 2.5 Pro", inputUsdPer1M: 1.25, outputUsdPer1M: 10 }
|
|
105
|
-
];
|
|
106
|
-
|
|
107
|
-
const DEFAULT_MODEL_PRICING_ROWS: SeedModelPricingRow[] = [
|
|
108
|
-
...OPENAI_MODEL_BASE_PRICES.map((row) => ({ ...row, providerType: "openai_api" as const })),
|
|
109
|
-
...CLAUDE_MODEL_BASE_PRICES.map((row) => ({ ...row, providerType: "anthropic_api" as const })),
|
|
110
|
-
...GEMINI_MODEL_BASE_PRICES.map((row) => ({ ...row, providerType: "gemini_api" as const }))
|
|
111
|
-
];
|
|
112
|
-
|
|
113
|
-
export async function ensureCompanyModelPricingDefaults(db: BopoDb, companyId: string) {
|
|
114
|
-
for (const row of DEFAULT_MODEL_PRICING_ROWS) {
|
|
115
|
-
await upsertModelPricing(db, {
|
|
116
|
-
companyId,
|
|
117
|
-
providerType: row.providerType,
|
|
118
|
-
modelId: row.modelId,
|
|
119
|
-
displayName: row.displayName,
|
|
120
|
-
inputUsdPer1M: row.inputUsdPer1M.toFixed(6),
|
|
121
|
-
outputUsdPer1M: row.outputUsdPer1M.toFixed(6),
|
|
122
|
-
currency: "USD",
|
|
123
|
-
updatedBy: "system:onboarding-defaults"
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
}
|
|
2
|
+
import type { CanonicalPricingProvider } from "../pricing";
|
|
3
|
+
import { getModelPricingCatalogRow } from "../pricing";
|
|
127
4
|
|
|
128
5
|
export async function calculateModelPricedUsdCost(input: {
|
|
129
6
|
db: BopoDb;
|
|
@@ -145,8 +22,7 @@ export async function calculateModelPricedUsdCost(input: {
|
|
|
145
22
|
pricingModelId: normalizedModelId || null
|
|
146
23
|
};
|
|
147
24
|
}
|
|
148
|
-
const pricing =
|
|
149
|
-
companyId: input.companyId,
|
|
25
|
+
const pricing = getModelPricingCatalogRow({
|
|
150
26
|
providerType: canonicalPricingProviderType,
|
|
151
27
|
modelId: normalizedModelId
|
|
152
28
|
});
|
|
@@ -189,7 +65,7 @@ export async function calculateModelPricedUsdCost(input: {
|
|
|
189
65
|
};
|
|
190
66
|
}
|
|
191
67
|
|
|
192
|
-
export function resolveCanonicalPricingProvider(providerType: string | null | undefined) {
|
|
68
|
+
export function resolveCanonicalPricingProvider(providerType: string | null | undefined): CanonicalPricingProvider | null {
|
|
193
69
|
const normalizedProvider = providerType?.trim() ?? "";
|
|
194
70
|
if (!normalizedProvider) {
|
|
195
71
|
return null;
|