Skip to content

Commit 9c689f7

Browse files
Merge branch 'main' into feature/add-unstructured-api-provider
2 parents 4f8f39f + d67ac32 commit 9c689f7

407 files changed

Lines changed: 188274 additions & 4190 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/CODEOWNERS

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,9 @@
22

33
# These owners will be the default owners for everything in
44
# the repo. Unless a later match takes precedence,
5-
* @ashwinb @raghotham @ehhuang @leseb @bbrowning @mattf @franciscojavierarceo @cdoern
5+
* @ashwinb @raghotham @ehhuang @leseb @bbrowning @mattf @franciscojavierarceo @cdoern @skamenan7
6+
7+
# OpenAPI SDK generation and publishing
8+
/client-sdks/openapi/ @ashwinb @leseb @bbrowning
9+
/.github/workflows/openapi-generator-validation.yml @ashwinb @leseb @bbrowning
10+
/.github/workflows/publish-openapi-sdk.yml @ashwinb @leseb @bbrowning

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ contact_links:
44
- name: Have you read the docs?
55
url: https://ogx-ai.github.io/docs
66
about: Much help can be found in the docs
7-
- name: Chat on Slack
8-
url: https://join.slack.com/t/ogx-ai/shared_invite/zt-3uyw5bxj9-tSEwsNZncgkGEKbd4dXIpw
9-
about: Maybe chatting with the community can help
7+
- name: Join the Discord community
8+
url: https://discord.gg/bUYRqEvK6
9+
about: Ask questions and chat with the community

.github/actions/run-and-record-tests/action.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ inputs:
2424
description: 'Regex pattern to pass to pytest -k'
2525
required: false
2626
default: ''
27+
text-model:
28+
description: 'Text model override to pass to integration-tests.sh'
29+
required: false
30+
default: ''
2731
target-branch:
2832
description: 'Target branch for recording commits (for PRs, use the PR head branch)'
2933
required: false
@@ -56,6 +60,7 @@ runs:
5660
INPUT_SUITE: ${{ inputs.suite }}
5761
INPUT_SUBDIRS: ${{ inputs.subdirs }}
5862
INPUT_PATTERN: ${{ inputs.pattern }}
63+
INPUT_TEXT_MODEL: ${{ inputs.text-model }}
5964
run: |
6065
SCRIPT_ARGS="--stack-config ${INPUT_STACK_CONFIG} --inference-mode ${INPUT_INFERENCE_MODE}"
6166
@@ -72,6 +77,9 @@ runs:
7277
if [ -n "${INPUT_PATTERN}" ]; then
7378
SCRIPT_ARGS="${SCRIPT_ARGS} --pattern ${INPUT_PATTERN}"
7479
fi
80+
if [ -n "${INPUT_TEXT_MODEL}" ]; then
81+
SCRIPT_ARGS="${SCRIPT_ARGS} --text-model ${INPUT_TEXT_MODEL}"
82+
fi
7583
7684
echo "=== Running command ==="
7785
echo "uv run --no-sync ./scripts/integration-tests.sh $SCRIPT_ARGS"

.github/actions/setup-runner/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ runs:
4646
# Install specific client version after sync if needed
4747
if [ "${{ steps.client-config.outputs.install-after-sync }}" = "true" ]; then
4848
echo "Installing ogx-client from: ${{ steps.client-config.outputs.install-source }}"
49-
uv pip install ${{ steps.client-config.outputs.install-source }}
49+
uv pip install --upgrade ${{ steps.client-config.outputs.install-source }}
5050
fi
5151
5252
echo "Installed ogx packages"

.github/dependabot.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,17 @@ updates:
2121
commit-message:
2222
prefix: chore(python-deps)
2323

24+
- package-ecosystem: "uv"
25+
directory: "/src/ogx_api"
26+
schedule:
27+
interval: "weekly"
28+
day: "saturday"
29+
labels:
30+
- type/dependencies
31+
- python
32+
commit-message:
33+
prefix: chore(api-deps)
34+
2435
- package-ecosystem: npm
2536
directory: "/ogx_ui"
2637
schedule:

.github/scripts/update_constraint_deps.py

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,38 @@ def insert_constraint(lines: list[str], pkg_name: str, version: str) -> tuple[li
101101
return lines, True, f"{pkg_name}: added to constraint-dependencies with >={version}"
102102

103103

104+
def add_floor(line: str, pkg_name: str, version: str) -> tuple[str, bool, str]:
105+
"""Add a >= floor to a dependency line that has no version specifier.
106+
107+
Transforms "pkg" or "pkg", into "pkg>=version" or "pkg>=version",
108+
preserving extras, whitespace, trailing comma, and inline comments.
109+
110+
Returns (new_line, changed, reason).
111+
"""
112+
pkg_pattern = normalize_pkg_pattern(pkg_name)
113+
bare_pattern = re.compile(
114+
rf'(?P<pre>\s*")(?P<name>{pkg_pattern})(?P<extras>\[[^\]]*\])?(?P<post>")',
115+
re.IGNORECASE,
116+
)
117+
match = bare_pattern.search(line)
118+
if not match:
119+
return line, False, f"could not parse dependency line for {pkg_name}"
120+
121+
extras = match.group("extras") or ""
122+
new_line = bare_pattern.sub(
123+
rf"\g<pre>\g<name>{extras}>={version}\g<post>",
124+
line,
125+
)
126+
return new_line, True, f"{pkg_name}: added >= floor {version}"
127+
128+
104129
def update_constraint(line: str, pkg_name: str, new_version: str) -> tuple[str, bool, str]:
105-
"""Update the >= lower bound in a constraint-dependencies line.
130+
"""Update the >= lower bound in a dependency line.
106131
107132
Returns (new_line, changed, reason).
108133
"""
109134
pkg_pattern = normalize_pkg_pattern(pkg_name)
110-
lower_bound_pattern = re.compile(rf'("{pkg_pattern}>=)([\d]+(?:\.[\d]+)*)', re.IGNORECASE)
135+
lower_bound_pattern = re.compile(rf'("{pkg_pattern}(?:\[[^\]]*\])?>=)([\d]+(?:\.[\d]+)*)', re.IGNORECASE)
111136

112137
match = lower_bound_pattern.search(line)
113138
if not match:
@@ -117,7 +142,9 @@ def update_constraint(line: str, pkg_name: str, new_version: str) -> tuple[str,
117142
if parse_version(new_version) <= parse_version(old_version):
118143
return line, False, (f"{pkg_name}: new version {new_version} <= current floor {old_version}")
119144

120-
upper_bound_match = re.search(rf'"{pkg_pattern}>=[^"]*,<([\d]+(?:\.[\d]+)*)"', line, re.IGNORECASE)
145+
upper_bound_match = re.search(
146+
rf'"{pkg_pattern}(?:\[[^\]]*\])?>=(?:[^"]*),<([\d]+(?:\.[\d]+)*)"', line, re.IGNORECASE
147+
)
121148
if upper_bound_match:
122149
upper_version = upper_bound_match.group(1)
123150
if parse_version(new_version) >= parse_version(upper_version):
@@ -164,32 +191,31 @@ def main() -> int:
164191
print("updated=true")
165192
return 0
166193

167-
# 2. Try updating >= floors in regular dependency arrays
194+
# 2. Update in place in regular dependency arrays — either bump an existing
195+
# >= floor or add one when the dep is bare (no version specifier).
168196
if dep_indices:
169197
any_changed = False
170-
has_floor = False
198+
skip_reasons = []
171199
for idx in dep_indices:
172200
new_line, changed, reason = update_constraint(lines[idx], args.dependency_name, args.dependency_version)
201+
if not changed and "no >= lower bound" in reason:
202+
new_line, changed, reason = add_floor(lines[idx], args.dependency_name, args.dependency_version)
173203
if changed:
174204
lines[idx] = new_line
175205
any_changed = True
176-
has_floor = True
177206
print(f"UPDATED (dependencies): {reason}")
178-
elif "no >= lower bound" not in reason:
179-
has_floor = True
180-
print(f"SKIP (dependencies): {reason}")
207+
else:
208+
skip_reasons.append(reason)
181209
if any_changed:
182210
pyproject_path.write_text("".join(lines))
183211
print("updated=true")
184-
return 0
185-
if has_floor:
212+
else:
213+
for r in skip_reasons:
214+
print(f"SKIP (dependencies): {r}")
186215
print("updated=false")
187-
return 0
188-
# Found in dependencies but no >= floor anywhere — fall through to
189-
# add to constraint-dependencies so the version floor is tracked somewhere
216+
return 0
190217

191-
# 3. Not found in constraint-dependencies, and either not in regular deps
192-
# or present without a >= floor — add to constraint-dependencies
218+
# 3. Not found anywhere — add to constraint-dependencies
193219
lines, changed, reason = insert_constraint(lines, args.dependency_name, args.dependency_version)
194220
if not changed:
195221
print(f"SKIP: {reason}")

.github/workflows/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ OGX uses GitHub Actions for Continuous Integration (CI). Below is a table detail
1717
| Integration Auth Tests | [integration-auth-tests.yml](integration-auth-tests.yml) | Run the integration test suite with Kubernetes authentication |
1818
| Integration Responses, Conversations & Prompts Auth Tests | [integration-responses-conversations-auth-tests.yml](integration-responses-conversations-auth-tests.yml) | Run responses, conversations, and prompts auth tests with Kubernetes authentication |
1919
| SqlStore Integration Tests | [integration-sql-store-tests.yml](integration-sql-store-tests.yml) | Run the integration test suite with SqlStore |
20+
| Responses API - Codex CLI Smoke Test | [integration-tests-codex-cli.yml](integration-tests-codex-cli.yml) | Manually drive the real Codex CLI against /v1/responses |
21+
| Messages API - Claude Code Client Smoke Tests | [integration-tests-messages-clients.yml](integration-tests-messages-clients.yml) | Drive the Claude Code CLI and Agent SDK against /v1/messages (live, Ollama) |
2022
| Integration Tests (Replay) | [integration-tests.yml](integration-tests.yml) | Run the integration test suites from tests/integration in replay mode |
2123
| Vector IO Integration Tests | [integration-vector-io-tests.yml](integration-vector-io-tests.yml) | Run the integration test suite with various VectorIO providers |
2224
| OpenAPI Generator SDK Validation | [openapi-generator-validation.yml](openapi-generator-validation.yml) | Validate OpenAPI Generator SDK generation |
@@ -25,6 +27,7 @@ OGX uses GitHub Actions for Continuous Integration (CI). Below is a table detail
2527
| Pre-commit | [pre-commit.yml](pre-commit.yml) | Run pre-commit checks |
2628
| Prepare release | [prepare-release.yml](prepare-release.yml) | Prepare release |
2729
| Test OGX Build | [providers-build.yml](providers-build.yml) | Test ogx build and list-deps |
30+
| Publish OpenAPI SDK to PyPI | [publish-openapi-sdk.yml](publish-openapi-sdk.yml) | Publish ogx-open-client to PyPI |
2831
| Build, test, and publish packages | [pypi.yml](pypi.yml) | Build, test, and publish packages |
2932
| Integration Tests (Record) | [record-integration-tests.yml](record-integration-tests.yml) | Auto-record missing test recordings for PR |
3033
| Release Branch Scheduled CI | [release-branch-scheduled-ci.yml](release-branch-scheduled-ci.yml) | Scheduled CI checks for active release branches |

.github/workflows/backward-compat.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ jobs:
4141
python-version: '3.12'
4242

4343
- name: Install uv
44-
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
44+
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
4545
with:
4646
enable-cache: true
4747

@@ -451,7 +451,7 @@ jobs:
451451
python-version: '3.12'
452452

453453
- name: Install uv
454-
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
454+
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
455455
with:
456456
enable-cache: true
457457

.github/workflows/build-distributions.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ jobs:
9090
uses: ./.github/actions/setup-runner
9191

9292
- name: Set up Docker Buildx
93-
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd
93+
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5
9494

9595
- name: Build distribution image
9696
env:

.github/workflows/ci-status.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ jobs:
4343
const excludedApps = new Set(['mergify']);
4444
4545
const terminalStatuses = new Set(['completed']);
46-
const successConclusions = new Set(['success', 'skipped', 'neutral']);
47-
const failureConclusions = new Set(['failure', 'cancelled', 'timed_out']);
46+
const successConclusions = new Set(['success', 'skipped', 'neutral', 'cancelled']);
47+
const failureConclusions = new Set(['failure', 'timed_out']);
4848
4949
while (true) {
5050
const { data: checkRuns } = await github.rest.checks.listForRef({

0 commit comments

Comments
 (0)