Skip to content

Commit 4c95ccc

Browse files
committed
chore: resolve merge conflict with main and regenerate lockfiles
Resolved conflict in src/ogx_api/pyproject.toml keeping pydantic>=2.13.4 from this PR and jsonschema>=4.26.0 from recently merged #5959. Regenerated both uv.lock files. Signed-off-by: Sébastien Han <seb@redhat.com>
2 parents 5046dfc + d906581 commit 4c95ccc

9 files changed

Lines changed: 176 additions & 134 deletions

File tree

.github/workflows/stale_bot.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ jobs:
2424
runs-on: ubuntu-latest
2525
steps:
2626
- name: Stale Action
27-
uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0
27+
uses: actions/stale@eb5cf3af3ac0a1aa4c9c45633dd1ae542a27a899 # v10.3.0
2828
with:
2929
stale-issue-label: 'stale'
3030
stale-issue-message: >

pyproject.toml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ dependencies = [
6565
"termcolor",
6666
"tiktoken",
6767
"uvicorn>=0.34.0", # server
68-
"opentelemetry-sdk>=1.30.0", # server
68+
"opentelemetry-sdk>=1.42.1", # server
6969
"opentelemetry-exporter-otlp-proto-http>=1.30.0", # server
7070
"opentelemetry-distro>=0.60b1", # optional CLI instrumentation; only pre-releases on PyPI (latest 0.60b1)
7171
"aiosqlite>=0.21.0", # server - for metadata store
@@ -82,9 +82,9 @@ client = [
8282
]
8383
starter = [
8484
"aiohttp",
85-
"anthropic",
85+
"anthropic>=0.104.1",
8686
"autoevals",
87-
"boto3>=1.43.9",
87+
"boto3>=1.43.15",
8888
"chardet",
8989
"chromadb-client",
9090
"datasets>=4.0.0",
@@ -143,7 +143,7 @@ dev = [
143143
"ruamel.yaml", # needed for openapi generator
144144
"openapi-spec-validator>=0.7.2",
145145
"ogx-client>=1.0.2",
146-
"boto3>=1.43.9",
146+
"boto3>=1.43.15",
147147
"torch>=2.6.0",
148148
]
149149
# Type checking dependencies - includes type stubs and optional runtime dependencies
@@ -162,11 +162,11 @@ type_checking = [
162162
"streamlit",
163163
"streamlit-option-menu",
164164
"pandas",
165-
"anthropic",
165+
"anthropic>=0.104.1",
166166
"databricks-sdk",
167167
"fairscale",
168168
"torchtune",
169-
"trl",
169+
"trl>=1.5.0",
170170
"peft",
171171
"datasets",
172172
"together",
@@ -197,7 +197,7 @@ test-common = [
197197
# These are the dependencies required for running unit tests.
198198
unit = [
199199
{include-group = "test-common"},
200-
"anthropic",
200+
"anthropic>=0.104.1",
201201
"blobfile",
202202
"coverage",
203203
"databricks-sdk",

src/ogx/cli/stack/run.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@
1717
from termcolor import cprint
1818

1919
from ogx.cli.subcommand import Subcommand
20+
from ogx.core.datatypes import StackConfig
21+
from ogx.core.distribution import builtin_automatically_routed_apis, get_provider_registry
22+
from ogx.core.resolver import validate_and_prepare_providers
23+
from ogx.core.server.server import remove_disabled_providers
2024
from ogx.core.stack import run_config_from_dynamic_config_spec
25+
from ogx.core.utils.config import redact_sensitive_fields
2126
from ogx.core.utils.config_dirs import DISTRIBS_BASE_DIR, UI_LOGS_DIR
2227
from ogx.core.utils.config_resolution import resolve_config_or_distro
2328
from ogx.log import get_logger
@@ -52,22 +57,25 @@ def add_run_arguments(parser: argparse.ArgumentParser) -> None:
5257
default=None,
5358
help="Run a stack with only a list of providers. This list is formatted like: api1=provider1,api1=provider2,api2=provider3. Where there can be multiple providers per API.",
5459
)
60+
parser.add_argument(
61+
"--dry-run",
62+
action="store_true",
63+
help="Validate the config without starting the server.",
64+
)
5565

5666

5767
def run_stack_cmd(args: argparse.Namespace, parser: argparse.ArgumentParser) -> None:
5868
import yaml
5969

6070
from ogx.core.configure import parse_and_maybe_upgrade_config
6171

62-
if args.enable_ui:
72+
if args.enable_ui and not args.dry_run:
6373
env_port = os.getenv("OGX_PORT")
6474
ui_port = args.port or (int(env_port) if env_port else None) or 8321
6575
_start_ui_development_server(ui_port)
6676

6777
if args.config:
6878
try:
69-
from ogx.core.utils.config_resolution import resolve_config_or_distro
70-
7179
config_file = resolve_config_or_distro(args.config)
7280
except ValueError as e:
7381
parser.error(str(e))
@@ -108,9 +116,30 @@ def run_stack_cmd(args: argparse.Namespace, parser: argparse.ArgumentParser) ->
108116
except AttributeError as e:
109117
parser.error(f"failed to parse config file '{config_file}':\n {e}")
110118

119+
if args.dry_run:
120+
if not config_file:
121+
parser.error("--dry-run requires a config file or --providers")
122+
_dry_run_validate(config, config_file)
123+
return
124+
111125
_uvicorn_run(config_file, args, parser)
112126

113127

128+
def _dry_run_validate(config: StackConfig, config_file: Path) -> None:
129+
routed_apis = builtin_automatically_routed_apis()
130+
validate_and_prepare_providers(
131+
run_config=config,
132+
provider_registry=get_provider_registry(),
133+
routing_table_apis={x.routing_table_api for x in routed_apis},
134+
router_apis={x.router_api for x in routed_apis},
135+
)
136+
logger.info("Config validation passed", config_file=config_file)
137+
138+
safe_config = redact_sensitive_fields(config.model_dump(mode="json"))
139+
clean_config = remove_disabled_providers(safe_config)
140+
print(yaml.dump(clean_config, indent=2, default_flow_style=False, sort_keys=False))
141+
142+
114143
def _uvicorn_run(config_file: Path | None, args: argparse.Namespace, parser: argparse.ArgumentParser) -> None:
115144
if not config_file:
116145
parser.error("Config file is required")

src/ogx/providers/remote/inference/bedrock/bedrock.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# This source code is licensed under the terms described in the LICENSE file in
55
# the root directory of this source tree.
66

7+
import asyncio
78
from collections.abc import AsyncIterator, Iterable
89
from typing import TYPE_CHECKING, Any, NoReturn
910

@@ -175,8 +176,9 @@ async def check_model_availability(self, model: str) -> bool:
175176

176177
async def shutdown(self) -> None:
177178
if self._sigv4_http_client is not None:
178-
await self._sigv4_http_client.aclose()
179+
await asyncio.shield(self._sigv4_http_client.aclose())
179180
self._sigv4_http_client = None
181+
await super().shutdown()
180182

181183
async def openai_embeddings(
182184
self,

src/ogx_api/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ dependencies = [
3232
"openai>=2.30.0",
3333
"fastapi>=0.115.0,<1.0",
3434
"pydantic>=2.13.4",
35-
"jsonschema",
35+
"jsonschema>=4.26.0",
3636
"opentelemetry-sdk>=1.30.0",
37-
"opentelemetry-exporter-otlp-proto-http>=1.30.0",
37+
"opentelemetry-exporter-otlp-proto-http>=1.42.1",
3838
]
3939

4040
[project.urls]

src/ogx_api/uv.lock

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

tests/unit/cli/test_stack_config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ def test_providers_flag_generates_config_with_api_keys():
244244
image_type=None,
245245
distro_name=None,
246246
enable_ui=False,
247+
dry_run=False,
247248
)
248249

249250
# Mock _uvicorn_run to prevent starting a server

0 commit comments

Comments
 (0)