From 8a054f8591d3703397f4c47c096863c3e64885bf Mon Sep 17 00:00:00 2001 From: Jakub Bogacz Date: Tue, 25 Aug 2026 16:17:04 +0200 Subject: [PATCH 1/6] feat(proto): define demand forecast gRPC contract --- proto/demand/v1/demand_forecast.proto | 37 +++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 proto/demand/v1/demand_forecast.proto diff --git a/proto/demand/v1/demand_forecast.proto b/proto/demand/v1/demand_forecast.proto new file mode 100644 index 0000000..978b9aa --- /dev/null +++ b/proto/demand/v1/demand_forecast.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; +package demand.v1; +option go_package = "github.com/m1kus3q/pubpredictor/backend/pkg/pb/demand/v1;demandv1"; +// Provides product demand forecasts for future dates. +service DemandForecastService { + rpc ForecastDemand(ForecastDemandRequest) + returns (ForecastDemandResponse); +} + +// Requests demand forecasts for an inclusive date range of up to 14 days. +message ForecastDemandRequest{ + int64 bar_id = 1; + + // Inclusive first forecast date in YYYY-MM-DD format. + string date_from = 2; + + // Inclusive last forecast date in YYYY-MM-DD format. + string date_to = 3; +} + +// Represents forecast demand for one product on one day. +message DailyDemandForecast { + string date = 1; + double predicted_quantity = 2; +} + +// Contains daily and aggregated forecasts for one product. +message ProductDemandForecast { + int64 plu = 1; + repeated DailyDemandForecast daily_forecasts = 2; + double total_predicted_quantity = 3; +} + +// Contains forecasts for all active products in the selected bar. +message ForecastDemandResponse { + repeated ProductDemandForecast products = 1; +} From 2f1d47c9e5858f161c23cb3913165e1784ff3579 Mon Sep 17 00:00:00 2001 From: Jakub Bogacz Date: Tue, 25 Aug 2026 16:18:23 +0200 Subject: [PATCH 2/6] fix(inference): align protobuf runtime with generated code --- inference/poetry.lock | 20 ++++++++++---------- inference/pyproject.toml | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/inference/poetry.lock b/inference/poetry.lock index f64e19d..fabf4a7 100644 --- a/inference/poetry.lock +++ b/inference/poetry.lock @@ -403,20 +403,20 @@ files = [ [[package]] name = "protobuf" -version = "7.34.1" +version = "7.36.0" description = "" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "protobuf-7.34.1-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:d8b2cc79c4d8f62b293ad9b11ec3aebce9af481fa73e64556969f7345ebf9fc7"}, - {file = "protobuf-7.34.1-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:5185e0e948d07abe94bb76ec9b8416b604cfe5da6f871d67aad30cbf24c3110b"}, - {file = "protobuf-7.34.1-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:403b093a6e28a960372b44e5eb081775c9b056e816a8029c61231743d63f881a"}, - {file = "protobuf-7.34.1-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:8ff40ce8cd688f7265326b38d5a1bed9bfdf5e6723d49961432f83e21d5713e4"}, - {file = "protobuf-7.34.1-cp310-abi3-win32.whl", hash = "sha256:34b84ce27680df7cca9f231043ada0daa55d0c44a2ddfaa58ec1d0d89d8bf60a"}, - {file = "protobuf-7.34.1-cp310-abi3-win_amd64.whl", hash = "sha256:e97b55646e6ce5cbb0954a8c28cd39a5869b59090dfaa7df4598a7fba869468c"}, - {file = "protobuf-7.34.1-py3-none-any.whl", hash = "sha256:bb3812cd53aefea2b028ef42bd780f5b96407247f20c6ef7c679807e9d188f11"}, - {file = "protobuf-7.34.1.tar.gz", hash = "sha256:9ce42245e704cc5027be797c1db1eb93184d44d1cdd71811fb2d9b25ad541280"}, + {file = "protobuf-7.36.0-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:9103532dffd80c6fab7e50c65a31007680a06eb57537d437bb1b35812c138a37"}, + {file = "protobuf-7.36.0-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:bf94a5917c71058262de683669bc0a797a7669d3de71f0b36d058e3194f47b44"}, + {file = "protobuf-7.36.0-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:3297e60abdff301e5f74393d87f6cc59dacab5f024a89548a6e8de1d26576b16"}, + {file = "protobuf-7.36.0-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:70f5ec8eb0da81a44360c0dc0beac99a0d78071d21956a7076bae8bd2051841b"}, + {file = "protobuf-7.36.0-cp310-abi3-win32.whl", hash = "sha256:7326fd717bdc419162a735938d89d4032332bcc3408804012b24ff3a37086071"}, + {file = "protobuf-7.36.0-cp310-abi3-win_amd64.whl", hash = "sha256:1781cc1de61249b750848029bca452c0a8b7e990080316b9bbc2518b2117b488"}, + {file = "protobuf-7.36.0-py3-none-any.whl", hash = "sha256:53374d53fc29a67f7dbbf0ade47d7526a0f0137bf0f9c90e48d8a60790ef748c"}, + {file = "protobuf-7.36.0.tar.gz", hash = "sha256:e8e09cb0d794c6687926fa558a8a6e72aa10edb997d5ca61da0765f12a3e00ea"}, ] [[package]] @@ -525,4 +525,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = ">=3.12" -content-hash = "e9d2705950e3ea9d30ade22a658a17a2506380d4d2796b98ebb917c3aedae9c4" +content-hash = "81db65e43b02c9cea857201ce4e643cdc1f153f179356a87d563c672431995fa" diff --git a/inference/pyproject.toml b/inference/pyproject.toml index 49e88b3..5970cb6 100644 --- a/inference/pyproject.toml +++ b/inference/pyproject.toml @@ -9,7 +9,7 @@ readme = "README.md" requires-python = ">=3.12" dependencies = [ "grpcio (>=1.78.0,<2.0.0)", - "protobuf (>=7.34.1,<8.0.0)", + "protobuf (>=7.36.0,<8.0.0)", "types-grpcio (>=1.0.0.20251009,<2.0.0.0)", ] From 162c59b7f8fe92ebba1f79a1e91b292fca7bfbd7 Mon Sep 17 00:00:00 2001 From: Jakub Bogacz Date: Tue, 25 Aug 2026 16:18:43 +0200 Subject: [PATCH 3/6] docs: document demand forecast response ownership --- docs/reference/demand-forecast-response.md | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 docs/reference/demand-forecast-response.md diff --git a/docs/reference/demand-forecast-response.md b/docs/reference/demand-forecast-response.md new file mode 100644 index 0000000..872e96a --- /dev/null +++ b/docs/reference/demand-forecast-response.md @@ -0,0 +1,33 @@ +# Demand Forecast Response + +## Inference Output + +The inference service returns model-related forecast data: + +- PLU; +- predicted quantity for each requested day; +- total predicted quantity for the selected date range. + +The model may return fractional quantities. Display rounding should be handled after calculating the aggregated prediction. + +## Backend Enrichment + +Before returning forecasts to the frontend, the backend should enrich each product result with data stored in the database: + +- product name; +- unit; +- category name; +- other product presentation details required by the UI. + +The backend matches forecast results with product data using the PLU. + +## Not Available Yet + +The current inference response does not include: + +- prediction intervals or uncertainty margins; +- feature contributions; +- event contributions; +- category-level aggregates. + +These capabilities require additional implementation in training or inference before they can be exposed to the frontend. From 2b83c9a7f405def612bae67e2a6c6b8dc264bd8e Mon Sep 17 00:00:00 2001 From: Jakub Bogacz Date: Wed, 26 Aug 2026 14:14:00 +0200 Subject: [PATCH 4/6] feat(proto): support forecasting selected products --- proto/demand/v1/demand_forecast.proto | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/proto/demand/v1/demand_forecast.proto b/proto/demand/v1/demand_forecast.proto index 978b9aa..12c5574 100644 --- a/proto/demand/v1/demand_forecast.proto +++ b/proto/demand/v1/demand_forecast.proto @@ -7,7 +7,7 @@ service DemandForecastService { returns (ForecastDemandResponse); } -// Requests demand forecasts for an inclusive date range of up to 14 days. +// Requests demand forecasts for selected products and an inclusive date range. message ForecastDemandRequest{ int64 bar_id = 1; @@ -16,6 +16,8 @@ message ForecastDemandRequest{ // Inclusive last forecast date in YYYY-MM-DD format. string date_to = 3; + + repeated int64 plu_ids = 4; } // Represents forecast demand for one product on one day. @@ -31,7 +33,7 @@ message ProductDemandForecast { double total_predicted_quantity = 3; } -// Contains forecasts for all active products in the selected bar. +// Contains forecasts only for products selected in the request. message ForecastDemandResponse { repeated ProductDemandForecast products = 1; } From 25e47ba2aa4a40f51e178fef38e83755bf90fa60 Mon Sep 17 00:00:00 2001 From: Jakub Bogacz Date: Wed, 26 Aug 2026 14:15:15 +0200 Subject: [PATCH 5/6] docs: clarify demand forecast product selection --- docs/reference/demand-forecast-response.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/docs/reference/demand-forecast-response.md b/docs/reference/demand-forecast-response.md index 872e96a..4043259 100644 --- a/docs/reference/demand-forecast-response.md +++ b/docs/reference/demand-forecast-response.md @@ -1,23 +1,30 @@ # Demand Forecast Response +## Product Selection + +The backend must provide one or more PLU identifiers in the forecast request. + +The inference service calculates predictions only for the requested PLUs. An empty PLU list is invalid and does not mean that all products should be forecast. + +When a user selects a category, the backend is responsible for resolving that category to its PLUs before requesting a forecast. + ## Inference Output -The inference service returns model-related forecast data: +For every requested PLU, the inference service returns: -- PLU; - predicted quantity for each requested day; - total predicted quantity for the selected date range. -The model may return fractional quantities. Display rounding should be handled after calculating the aggregated prediction. +The model may return fractional quantities. Display rounding should be applied after calculating the aggregated prediction. ## Backend Enrichment -Before returning forecasts to the frontend, the backend should enrich each product result with data stored in the database: +Before returning forecasts to the frontend, the backend enriches each result with data stored in the database: - product name; - unit; - category name; -- other product presentation details required by the UI. +- other presentation details required by the UI. The backend matches forecast results with product data using the PLU. @@ -29,5 +36,3 @@ The current inference response does not include: - feature contributions; - event contributions; - category-level aggregates. - -These capabilities require additional implementation in training or inference before they can be exposed to the frontend. From 6881d139af7ef64d6595068a710ea88258d8e907 Mon Sep 17 00:00:00 2001 From: Jakub Bogacz Date: Thu, 27 Aug 2026 15:38:59 +0200 Subject: [PATCH 6/6] feat(proto): use structured dates in demand forecast contract --- backend/go.mod | 17 ++++---- backend/go.sum | 58 ++++++++++++++------------- inference/poetry.lock | 20 ++++++++- inference/pyproject.toml | 1 + proto/buf.lock | 6 +++ proto/buf.yaml | 2 + proto/demand/v1/demand_forecast.proto | 14 +++---- 7 files changed, 72 insertions(+), 46 deletions(-) create mode 100644 proto/buf.lock diff --git a/backend/go.mod b/backend/go.mod index 6864825..9ed3049 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -13,8 +13,9 @@ require ( github.com/stretchr/testify v1.11.1 github.com/xuri/excelize/v2 v2.10.1 go.uber.org/mock v0.6.0 - google.golang.org/grpc v1.79.1 - google.golang.org/protobuf v1.36.11 + google.golang.org/genproto v0.0.0-20260825221802-da73d73af1c5 + google.golang.org/grpc v1.82.1 + google.golang.org/protobuf v1.36.12 gorm.io/driver/postgres v1.6.0 gorm.io/gorm v1.31.1 ) @@ -49,11 +50,11 @@ require ( github.com/tiendc/go-deepcopy v1.7.2 // indirect github.com/xuri/efp v0.0.1 // indirect github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 // indirect - golang.org/x/crypto v0.48.0 // indirect - golang.org/x/net v0.50.0 // indirect - golang.org/x/sync v0.19.0 // indirect - golang.org/x/sys v0.41.0 // indirect - golang.org/x/text v0.34.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect + golang.org/x/crypto v0.53.0 // indirect + golang.org/x/net v0.56.0 // indirect + golang.org/x/sync v0.22.0 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/text v0.40.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260819154853-08b0e4226688 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/backend/go.sum b/backend/go.sum index 4e78b2b..aa7282c 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -95,38 +95,40 @@ github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9 h1:+C0TIdyyYmzadGaL/HBL github.com/xuri/nfp v0.0.2-0.20250530014748-2ddeb826f9a9/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= -go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= -go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= -go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= -go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= -go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= -go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= -go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= -go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= -go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= -golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= -golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= +golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ= golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs= -golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= -golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= -golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= -golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= -google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY= -google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= +golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/genproto v0.0.0-20260825221802-da73d73af1c5 h1:jPP56YzdY899KJ5W7efXHt/CkjlVfAaoFOwdi/IEAFA= +google.golang.org/genproto v0.0.0-20260825221802-da73d73af1c5/go.mod h1:gutZdP0DwAHp4vu5WaXgEK7tjsJ77ZEqzlOFWGZGziE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260819154853-08b0e4226688 h1:cYNAzI2sUwhmCcoj9TxvihSrqsxt6uIkj3rDRhSDmW4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260819154853-08b0e4226688/go.mod h1:DjtHYE8FKJLivXcBEjGwndXfIC23G0VpXiXKqG179uA= +google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= +google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= +google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc= +google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/inference/poetry.lock b/inference/poetry.lock index fabf4a7..4edfc8a 100644 --- a/inference/poetry.lock +++ b/inference/poetry.lock @@ -96,6 +96,24 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.14.0,<2.15.0" pyflakes = ">=3.4.0,<3.5.0" +[[package]] +name = "googleapis-common-protos" +version = "1.75.2" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "googleapis_common_protos-1.75.2-py3-none-any.whl", hash = "sha256:6b83302f554ea93a0f48409c7fc2050f954bcbcddb7e3a9c76d4a823cb22920e"}, + {file = "googleapis_common_protos-1.75.2.tar.gz", hash = "sha256:8829a3d1e4508c5b7b9a6b9525f7fccff611f8531644579a76466c29295d4bb2"}, +] + +[package.dependencies] +protobuf = ">=6.33.5,<8.0.0" + +[package.extras] +grpc = ["grpcio (>=1.59.0,<2.0.0)"] + [[package]] name = "grpcio" version = "1.78.0" @@ -525,4 +543,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = ">=3.12" -content-hash = "81db65e43b02c9cea857201ce4e643cdc1f153f179356a87d563c672431995fa" +content-hash = "8f8837b9ddf673b6ae1ab90354baaea548359a4db3110c9e575351bf18383c7e" diff --git a/inference/pyproject.toml b/inference/pyproject.toml index 5970cb6..dd08256 100644 --- a/inference/pyproject.toml +++ b/inference/pyproject.toml @@ -11,6 +11,7 @@ dependencies = [ "grpcio (>=1.78.0,<2.0.0)", "protobuf (>=7.36.0,<8.0.0)", "types-grpcio (>=1.0.0.20251009,<2.0.0.0)", + "googleapis-common-protos (>=1.75.2,<2.0.0)", ] [tool.poetry] diff --git a/proto/buf.lock b/proto/buf.lock new file mode 100644 index 0000000..8447589 --- /dev/null +++ b/proto/buf.lock @@ -0,0 +1,6 @@ +# Generated by buf. DO NOT EDIT. +version: v2 +deps: + - name: buf.build/googleapis/googleapis + commit: c17df5b2beca46928cc87d5656bd5343 + digest: b5:648a01e0170d4512dea7d564016165decd1ed6e34bef79fe54753e51ad7e27545709ad9157d7551270147d551155c595a2fb0bf5bb33b1c83040ddbce915c604 diff --git a/proto/buf.yaml b/proto/buf.yaml index 056dd75..9aa57ea 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -1,4 +1,6 @@ version: v2 +deps: + - buf.build/googleapis/googleapis lint: use: - STANDARD diff --git a/proto/demand/v1/demand_forecast.proto b/proto/demand/v1/demand_forecast.proto index 12c5574..08df531 100644 --- a/proto/demand/v1/demand_forecast.proto +++ b/proto/demand/v1/demand_forecast.proto @@ -1,5 +1,6 @@ syntax = "proto3"; package demand.v1; +import "google/type/date.proto"; option go_package = "github.com/m1kus3q/pubpredictor/backend/pkg/pb/demand/v1;demandv1"; // Provides product demand forecasts for future dates. service DemandForecastService { @@ -8,21 +9,16 @@ service DemandForecastService { } // Requests demand forecasts for selected products and an inclusive date range. -message ForecastDemandRequest{ +message ForecastDemandRequest { int64 bar_id = 1; - - // Inclusive first forecast date in YYYY-MM-DD format. - string date_from = 2; - - // Inclusive last forecast date in YYYY-MM-DD format. - string date_to = 3; - + google.type.Date date_from = 2; + google.type.Date date_to = 3; repeated int64 plu_ids = 4; } // Represents forecast demand for one product on one day. message DailyDemandForecast { - string date = 1; + google.type.Date date = 1; double predicted_quantity = 2; }