Skip to content

Commit b3975b4

Browse files
authored
feat(llmcost): add (#3905)
1 parent cd53796 commit b3975b4

37 files changed

+4901
-58
lines changed

app/common/productcatalog.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import (
77
"github.com/google/wire"
88

99
"github.com/openmeterio/openmeter/app/config"
10+
"github.com/openmeterio/openmeter/openmeter/cost"
11+
costadapter "github.com/openmeterio/openmeter/openmeter/cost/adapter"
12+
costservice "github.com/openmeterio/openmeter/openmeter/cost/service"
1013
entdb "github.com/openmeterio/openmeter/openmeter/ent/db"
14+
"github.com/openmeterio/openmeter/openmeter/llmcost"
1115
"github.com/openmeterio/openmeter/openmeter/meter"
1216
productcatalogpgadapter "github.com/openmeterio/openmeter/openmeter/productcatalog/adapter"
1317
"github.com/openmeterio/openmeter/openmeter/productcatalog/addon"
@@ -20,11 +24,13 @@ import (
2024
"github.com/openmeterio/openmeter/openmeter/productcatalog/planaddon"
2125
planaddonadapter "github.com/openmeterio/openmeter/openmeter/productcatalog/planaddon/adapter"
2226
planaddonservice "github.com/openmeterio/openmeter/openmeter/productcatalog/planaddon/service"
27+
"github.com/openmeterio/openmeter/openmeter/streaming"
2328
"github.com/openmeterio/openmeter/openmeter/watermill/eventbus"
2429
)
2530

2631
var ProductCatalog = wire.NewSet(
2732
Feature,
33+
Cost,
2834
Plan,
2935
Addon,
3036
PlanAddon,
@@ -34,6 +40,10 @@ var Feature = wire.NewSet(
3440
NewFeatureConnector,
3541
)
3642

43+
var Cost = wire.NewSet(
44+
NewCostService,
45+
)
46+
3747
var Plan = wire.NewSet(
3848
NewPlanService,
3949
)
@@ -56,6 +66,19 @@ func NewFeatureConnector(
5666
return feature.NewFeatureConnector(featureRepo, meterService, publisher)
5767
}
5868

69+
func NewCostService(
70+
featureConnector feature.FeatureConnector,
71+
meterService meter.Service,
72+
streamingConnector streaming.Connector,
73+
llmcostService llmcost.Service,
74+
) (cost.Service, error) {
75+
adapter := costadapter.New(featureConnector, meterService, streamingConnector, llmcostService)
76+
77+
return costservice.New(costservice.Config{
78+
Adapter: adapter,
79+
})
80+
}
81+
5982
func NewPlanService(
6083
logger *slog.Logger,
6184
db *entdb.Client,

cmd/server/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,13 @@ func main() {
148148
Billing: app.Billing,
149149
BillingFeatureSwitches: conf.Billing.FeatureSwitches,
150150
CurrencyService: app.CurrencyService,
151+
CostService: app.CostService,
151152
Customer: app.Customer,
152153
DebugConnector: debugConnector,
153154
ErrorHandler: errorsx.NewSlogHandler(logger),
154155
EntitlementBalanceConnector: app.EntitlementRegistry.MeteredEntitlement,
155156
EntitlementConnector: app.EntitlementRegistry.Entitlement,
156-
FeatureConnector: app.EntitlementRegistry.Feature,
157+
FeatureConnector: app.FeatureConnector,
157158
GrantConnector: app.EntitlementRegistry.Grant,
158159
GrantRepo: app.EntitlementRegistry.GrantRepo,
159160
IngestService: app.IngestService,

cmd/server/wire.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/openmeterio/openmeter/app/common"
1616
"github.com/openmeterio/openmeter/app/config"
1717
"github.com/openmeterio/openmeter/openmeter/billing"
18+
"github.com/openmeterio/openmeter/openmeter/cost"
1819
"github.com/openmeterio/openmeter/openmeter/currencies"
1920
"github.com/openmeterio/openmeter/openmeter/customer"
2021
"github.com/openmeterio/openmeter/openmeter/ent/db"
@@ -54,6 +55,7 @@ type Application struct {
5455
CustomerEntitlementValidatorHook common.CustomerEntitlementValidatorHook
5556
Billing billing.Service
5657
CurrencyService currencies.CurrencyService
58+
CostService cost.Service
5759
EntClient *db.Client
5860
EventPublisher eventbus.Publisher
5961
EntitlementRegistry *registry.Entitlement

cmd/server/wire_gen.go

Lines changed: 23 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

etc/seed/seed.yaml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,18 @@ input:
77
let max_subjects = ${SEEDER_MAX_SUBJECTS:20}
88
let event_type = "tokens"
99
let source = "api-gateway"
10-
let models = ["gpt-3", "gpt-4"]
10+
let provider_models = [
11+
{"provider": "openai", "models": ["gpt-4o", "gpt-4-turbo", "gpt-3.5-turbo"]},
12+
{"provider": "anthropic", "models": ["claude-3-5-sonnet", "claude-3-opus", "claude-3-5-haiku"]}
13+
]
1114
let types = ["input", "output"]
1215
let subject = "customer-%d".format(random_int(seed: timestamp_unix_nano()) % $max_subjects)
1316
let time = now().ts_format()
14-
let model = $models.index(random_int(seed: timestamp_unix_nano()) % $models.length())
17+
# let time = (now().ts_sub_iso8601("P30D").ts_unix() + random_int(min: 60, max: 60 * 60 * 24 * 30)).ts_format()
18+
let idx = random_int(seed: timestamp_unix_nano()) % $provider_models.length()
19+
let selection = $provider_models.index($idx)
20+
let provider = $selection.provider
21+
let model = $selection.models.index(random_int(seed: timestamp_unix_nano()) % $selection.models.length())
1522
let type = $types.index(random_int(seed: timestamp_unix_nano()) % $types.length())
1623
let tokens = random_int(seed: timestamp_unix_nano(), max: 100)
1724
root = {
@@ -23,6 +30,7 @@ input:
2330
"time": $time,
2431
"data": {
2532
"model": $model,
33+
"provider": $provider,
2634
"type": $type,
2735
"tokens": $tokens,
2836
},

openmeter/cost/adapter.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package cost
2+
3+
import "context"
4+
5+
// Adapter provides the data access layer for cost computation.
6+
type Adapter interface {
7+
QueryFeatureCost(ctx context.Context, input QueryFeatureCostInput) (*CostQueryResult, error)
8+
}

0 commit comments

Comments
 (0)