Skip to content

Commit 957d4b9

Browse files
authored
Merge branch 'main' into feature/modality-support-detection
2 parents b4f577a + 947d43a commit 957d4b9

241 files changed

Lines changed: 18027 additions & 2330 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.

.devcontainer/Dockerfile

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ SHELL ["/bin/bash", "-c"]
77

88
USER root
99

10+
# Remove the Yarn repository (has expired GPG key and we don't use Yarn)
11+
RUN rm -f /etc/apt/sources.list.d/yarn.list 2>/dev/null || true
12+
1013
# Install required system packages + ODBC prerequisites
1114
RUN apt-get update && apt-get install -y \
1215
sudo \
@@ -20,15 +23,17 @@ RUN apt-get update && apt-get install -y \
2023
&& apt-get clean && rm -rf /var/lib/apt/lists/*
2124

2225
# Install the Azure CLI, Microsoft ODBC Driver 18 & SQL tools
26+
# Note: Debian Trixie's sqv rejects SHA1 signatures, so we use gpg directly to import the Microsoft key
2327
RUN apt-get update && apt-get install -y \
2428
apt-transport-https \
2529
ca-certificates \
2630
gnupg \
2731
lsb-release \
28-
&& curl -sL https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb \
29-
-o packages-microsoft-prod.deb \
30-
&& dpkg -i packages-microsoft-prod.deb \
31-
&& rm packages-microsoft-prod.deb \
32+
&& curl -sL https://packages.microsoft.com/keys/microsoft.asc \
33+
| gpg --dearmor \
34+
> /usr/share/keyrings/microsoft-archive-keyring.gpg \
35+
&& echo "deb [arch=amd64 signed-by=/usr/share/keyrings/microsoft-archive-keyring.gpg] https://packages.microsoft.com/debian/12/prod bookworm main" \
36+
> /etc/apt/sources.list.d/microsoft.list \
3237
&& apt-get update \
3338
&& ACCEPT_EULA=Y apt-get install -y \
3439
msodbcsql18 \

.devcontainer/devcontainer_setup.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,13 @@ if [ -f "package.json" ]; then
7171

7272
# Install Playwright browsers and system dependencies for E2E testing
7373
echo "📦 Installing Playwright browsers..."
74+
75+
# Remove third-party repos with SHA1 signature issues (rejected since 2026-02-01)
76+
# Playwright deps come from Debian main repos, these aren't needed
77+
sudo rm -f /etc/apt/sources.list.d/yarn.list \
78+
/etc/apt/sources.list.d/nodesource.list \
79+
/etc/apt/sources.list.d/microsoft.list 2>/dev/null || true
80+
7481
npx playwright install --with-deps chromium
7582

7683
echo "✅ Frontend dependencies installed."

.env_example

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,45 @@ PLATFORM_OPENAI_CHAT_GPT4O_MODEL="gpt-4o"
1919
AZURE_OPENAI_GPT4O_ENDPOINT="https://xxxx.openai.azure.com/openai/v1"
2020
AZURE_OPENAI_GPT4O_KEY="xxxxx"
2121
AZURE_OPENAI_GPT4O_MODEL="deployment-name"
22-
# Since deployment name may be custom and differ from the actual underlying model,
23-
# you can specify the underlying model for identifier purposes
22+
# Since Azure deployment name may be custom and differ from the actual underlying model,
23+
# you can specify the underlying model for identifier purposes. If not specified,
24+
# identifiers will default to the value of the standard MODEL environment variable.
2425
AZURE_OPENAI_GPT4O_UNDERLYING_MODEL="gpt-4o"
2526

2627
AZURE_OPENAI_INTEGRATION_TEST_ENDPOINT="https://xxxxx.openai.azure.com/openai/v1"
2728
AZURE_OPENAI_INTEGRATION_TEST_KEY="xxxxx"
2829
AZURE_OPENAI_INTEGRATION_TEST_MODEL="deployment-name"
30+
AZURE_OPENAI_INTEGRATION_TEST_UNDERLYING_MODEL=""
2931

3032
AZURE_OPENAI_GPT3_5_CHAT_ENDPOINT="https://xxxxx.openai.azure.com/openai/v1"
3133
AZURE_OPENAI_GPT3_5_CHAT_KEY="xxxxx"
3234
AZURE_OPENAI_GPT3_5_CHAT_MODEL="deployment-name"
35+
AZURE_OPENAI_GPT3_5_CHAT_UNDERLYING_MODEL=""
3336

3437
AZURE_OPENAI_GPT4_CHAT_ENDPOINT="https://xxxxx.openai.azure.com/openai/v1"
3538
AZURE_OPENAI_GPT4_CHAT_KEY="xxxxx"
3639
AZURE_OPENAI_GPT4_CHAT_MODEL="deployment-name"
40+
AZURE_OPENAI_GPT4_CHAT_UNDERLYING_MODEL=""
41+
42+
# Endpoints that host models with fewer safety mechanisms (e.g. via adversarial fine tuning
43+
# or content filters turned off) can be defined below and used in adversarial attack testing scenarios.
44+
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_ENDPOINT="https://xxxxx.openai.azure.com/openai/v1"
45+
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_KEY="xxxxx"
46+
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_MODEL="deployment-name"
47+
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_UNDERLYING_MODEL=""
48+
49+
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_ENDPOINT2="https://xxxxx.openai.azure.com/openai/v1"
50+
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_KEY2="xxxxx"
51+
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_MODEL2="deployment-name"
52+
AZURE_OPENAI_GPT4O_UNSAFE_CHAT_UNDERLYING_MODEL2=""
3753

3854
AZURE_FOUNDRY_DEEPSEEK_ENDPOINT="https://xxxxx.eastus2.models.ai.azure.com"
3955
AZURE_FOUNDRY_DEEPSEEK_KEY="xxxxx"
56+
AZURE_FOUNDRY_DEEPSEEK_MODEL=""
4057

4158
AZURE_FOUNDRY_PHI4_ENDPOINT="https://xxxxx.models.ai.azure.com"
4259
AZURE_CHAT_PHI4_KEY="xxxxx"
60+
AZURE_FOUNDRY_PHI4_MODEL=""
4361

4462
AZURE_FOUNDRY_MISTRAL_LARGE_ENDPOINT="https://xxxxx.services.ai.azure.com/openai/v1/"
4563
AZURE_FOUNDRY_MISTRAL_LARGE_KEY="xxxxx"
@@ -75,6 +93,7 @@ AZURE_OPENAI_GPT5_RESPONSES_ENDPOINT="https://xxxxxxxxx.azure.com/openai/v1"
7593
AZURE_OPENAI_GPT5_COMPLETION_ENDPOINT="https://xxxxxxxxx.azure.com/openai/v1"
7694
AZURE_OPENAI_GPT5_KEY="xxxxxxx"
7795
AZURE_OPENAI_GPT5_MODEL="gpt-5"
96+
AZURE_OPENAI_GPT5_UNDERLYING_MODEL="gpt-5"
7897

7998
PLATFORM_OPENAI_RESPONSES_ENDPOINT="https://api.openai.com/v1"
8099
PLATFORM_OPENAI_RESPONSES_KEY="sk-xxxxx"
@@ -83,6 +102,7 @@ PLATFORM_OPENAI_RESPONSES_MODEL="o4-mini"
83102
AZURE_OPENAI_RESPONSES_ENDPOINT="https://xxxxx.openai.azure.com/openai/v1"
84103
AZURE_OPENAI_RESPONSES_KEY="xxxxx"
85104
AZURE_OPENAI_RESPONSES_MODEL="o4-mini"
105+
AZURE_OPENAI_RESPONSES_UNDERLYING_MODEL="o4-mini"
86106

87107
OPENAI_RESPONSES_ENDPOINT=${PLATFORM_OPENAI_RESPONSES_ENDPOINT}
88108
OPENAI_RESPONSES_KEY=${PLATFORM_OPENAI_RESPONSES_KEY}
@@ -103,6 +123,7 @@ PLATFORM_OPENAI_REALTIME_MODEL="gpt-4o-realtime-preview"
103123
AZURE_OPENAI_REALTIME_ENDPOINT = "wss://xxxx.openai.azure.com/openai/v1"
104124
AZURE_OPENAI_REALTIME_API_KEY = "xxxxx"
105125
AZURE_OPENAI_REALTIME_MODEL = "gpt-4o-realtime-preview"
126+
AZURE_OPENAI_REALTIME_UNDERLYING_MODEL = "gpt-4o-realtime-preview"
106127

107128
OPENAI_REALTIME_ENDPOINT = ${PLATFORM_OPENAI_REALTIME_ENDPOINT}
108129
OPENAI_REALTIME_API_KEY = ${PLATFORM_OPENAI_REALTIME_API_KEY}
@@ -119,10 +140,12 @@ OPENAI_REALTIME_UNDERLYING_MODEL = ""
119140
OPENAI_IMAGE_ENDPOINT1 = "https://xxxxx.openai.azure.com/openai/v1"
120141
OPENAI_IMAGE_API_KEY1 = "xxxxxx"
121142
OPENAI_IMAGE_MODEL1 = "deployment-name"
143+
OPENAI_IMAGE_UNDERLYING_MODEL1 = "dall-e-3"
122144

123145
OPENAI_IMAGE_ENDPOINT2 = "https://api.openai.com/v1"
124146
OPENAI_IMAGE_API_KEY2 = "sk-xxxxx"
125147
OPENAI_IMAGE_MODEL2 = "dall-e-3"
148+
OPENAI_IMAGE_UNDERLYING_MODEL2 = "dall-e-3"
126149

127150
OPENAI_IMAGE_ENDPOINT = ${OPENAI_IMAGE_ENDPOINT2}
128151
OPENAI_IMAGE_API_KEY = ${OPENAI_IMAGE_API_KEY2}
@@ -140,10 +163,12 @@ OPENAI_IMAGE_UNDERLYING_MODEL = ""
140163
OPENAI_TTS_ENDPOINT1 = "https://xxxxx.openai.azure.com/openai/v1"
141164
OPENAI_TTS_KEY1 = "xxxxxxx"
142165
OPENAI_TTS_MODEL1 = "tts"
166+
OPENAI_TTS_UNDERLYING_MODEL1 = "tts"
143167

144168
OPENAI_TTS_ENDPOINT2 = "https://api.openai.com/v1"
145169
OPENAI_TTS_KEY2 = "xxxxxx"
146170
OPENAI_TTS_MODEL2 = "tts-1"
171+
OPENAI_TTS_UNDERLYING_MODEL2 = "tts-1"
147172

148173
OPENAI_TTS_ENDPOINT = ${OPENAI_TTS_ENDPOINT2}
149174
OPENAI_TTS_KEY = ${OPENAI_TTS_KEY2}
@@ -161,6 +186,7 @@ OPENAI_TTS_UNDERLYING_MODEL = ""
161186
AZURE_OPENAI_VIDEO_ENDPOINT="https://xxxxx.cognitiveservices.azure.com/openai/v1"
162187
AZURE_OPENAI_VIDEO_KEY="xxxxxxx"
163188
AZURE_OPENAI_VIDEO_MODEL="sora-2"
189+
AZURE_OPENAI_VIDEO_UNDERLYING_MODEL="sora-2"
164190

165191
OPENAI_VIDEO_ENDPOINT = ${AZURE_OPENAI_VIDEO_ENDPOINT}
166192
OPENAI_VIDEO_KEY = ${AZURE_OPENAI_VIDEO_KEY}

.github/instructions/style-guide.instructions.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,27 @@ def process(self, data: str) -> str:
9696

9797
## Documentation Standards
9898

99+
### Import Placement
100+
- **MANDATORY**: All import statements MUST be at the top of the file
101+
- Do NOT use inline/local imports inside functions or methods
102+
- The only exception is breaking circular import dependencies, which should be rare and documented
103+
104+
```python
105+
# CORRECT — imports at the top of the file
106+
from contextlib import closing
107+
from sqlalchemy.exc import SQLAlchemyError
108+
109+
def update_entry(self, entry: Base) -> None:
110+
with closing(self.get_session()) as session:
111+
...
112+
113+
# INCORRECT — inline import inside a function
114+
def update_entry(self, entry: Base) -> None:
115+
from contextlib import closing # ← WRONG, must be at top of file
116+
with closing(self.get_session()) as session:
117+
...
118+
```
119+
99120
### Docstring Format
100121
- Use Google-style docstrings
101122
- Include type information in parameter descriptions
@@ -457,4 +478,13 @@ Before committing code, ensure:
457478

458479
---
459480

481+
## File Editing Rules
482+
483+
### Never Use `sed` for File Edits
484+
- **MANDATORY**: Never use `sed` (or similar stream-editing CLI tools) to modify source files
485+
- `sed` frequently corrupts files, applies partial edits, or silently fails
486+
- Always use the editor's built-in replace/edit tools (e.g., `replace_string_in_file`, `multi_replace_string_in_file`) to make targeted, verifiable changes
487+
488+
---
489+
460490
**Remember**: Clean code is written for humans to read. Make your intent clear and your code self-documenting.

0 commit comments

Comments
 (0)