Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -77,3 +77,40 @@ jobs:
- name: Test frontend
working-directory: ./frontend
run: npm test

schemas:
name: Check generated schemas are up to date

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Use Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: 22.x

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install uv
uses: astral-sh/setup-uv@v4

- name: Install dependencies
run: |
npm install
cd scripts && uv sync

- name: Regenerate schemas
run: npm run update-schemas

- name: Check for diff
run: |
if ! git diff --exit-code docs/assets/api/schemas.json scripts/deliberate_lab/types.py; then
echo ""
echo "Generated schemas are out of date. Please run 'npm run update-schemas' and commit the changes."
exit 1
fi
75 changes: 74 additions & 1 deletion docs/assets/api/schemas.json
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@
"descriptions",
"progress",
"timeLimitInMinutes",
"requireFullTime"
"requireFullTime",
"discussions"
],
"properties": {
"id": {
Expand Down Expand Up @@ -125,6 +126,78 @@
"type": "null"
}
]
},
"discussions": {
"type": "array",
"items": {
"anyOf": [
{
"$ref": "#/$defs/DefaultChatDiscussion"
},
{
"$ref": "#/$defs/CompareChatDiscussion"
}
]
}
}
}
},
"DefaultChatDiscussion": {
"title": "DefaultChatDiscussion",
"additionalProperties": false,
"type": "object",
"required": ["id", "type", "description"],
"properties": {
"id": {
"type": "string"
},
"type": {
"const": "DEFAULT",
"type": "string"
},
"description": {
"type": "string"
}
}
},
"CompareChatDiscussion": {
"title": "CompareChatDiscussion",
"additionalProperties": false,
"type": "object",
"required": ["id", "type", "description", "items"],
"properties": {
"id": {
"type": "string"
},
"type": {
"const": "COMPARE",
"type": "string"
},
"description": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"$ref": "#/$defs/DiscussionItem"
}
}
}
},
"DiscussionItem": {
"title": "DiscussionItem",
"additionalProperties": false,
"type": "object",
"required": ["id", "imageId", "name"],
"properties": {
"id": {
"type": "string"
},
"imageId": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
Expand Down
47 changes: 39 additions & 8 deletions scripts/deliberate_lab/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,26 @@ class Stock(BaseModel):
customCards: list[CustomCard]


class DefaultChatDiscussion(BaseModel):
model_config = ConfigDict(
extra="forbid",
populate_by_name=True,
)
id: str
type: Literal["DEFAULT"] = "DEFAULT"
description: str


class DiscussionItem(BaseModel):
model_config = ConfigDict(
extra="forbid",
populate_by_name=True,
)
id: str
imageId: str
name: str


class ChipItem(BaseModel):
model_config = ConfigDict(
extra="forbid",
Expand Down Expand Up @@ -617,19 +637,15 @@ class CohortUpdate(BaseModel):
participantConfig: CohortParticipantConfig


class ChatStageConfig(BaseModel):
class CompareChatDiscussion(BaseModel):
model_config = ConfigDict(
extra="forbid",
populate_by_name=True,
)
id: str
kind: Literal["chat"] = "chat"
name: str
descriptions: Any
progress: Any
discussions: list[Any] = [] # Required for cohort creation
timeLimitInMinutes: float | None = None
requireFullTime: bool | None = None
type: Literal["COMPARE"] = "COMPARE"
description: str
items: list[DiscussionItem]


class ChipStageConfig(BaseModel):
Expand Down Expand Up @@ -923,6 +939,21 @@ class TosStageConfig(BaseModel):
tosLines: list[str]


class ChatStageConfig(BaseModel):
model_config = ConfigDict(
extra="forbid",
populate_by_name=True,
)
id: str
kind: Literal["chat"] = "chat"
name: str
descriptions: Any
progress: Any
timeLimitInMinutes: float | None = None
requireFullTime: bool | None = None
discussions: list[DefaultChatDiscussion | CompareChatDiscussion]


class RankingStageConfig(
RootModel[ItemRankingStageConfig | ParticipantRankingStageConfig]
):
Expand Down
45 changes: 43 additions & 2 deletions utils/src/stages/chat_stage.validation.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {Type, type Static} from '@sinclair/typebox';
import {UnifiedTimestampSchema} from '../shared.validation';
import {StageKind} from './stage';
import {ChatDiscussionType} from './chat_stage';
import {
StageTextConfigSchema,
StageProgressConfigSchema,
Expand All @@ -10,6 +11,47 @@ import {UserType} from '../participant';
/** Shorthand for strict TypeBox object validation */
const strict = {additionalProperties: false} as const;

// ************************************************************************* //
// ChatDiscussion types //
// ************************************************************************* //

/** DiscussionItem input validation. */
export const DiscussionItemData = Type.Object(
{
id: Type.String(),
imageId: Type.String(),
name: Type.String(),
},
{$id: 'DiscussionItem', ...strict},
);

/** DefaultChatDiscussion input validation. */
export const DefaultChatDiscussionData = Type.Object(
{
id: Type.String(),
type: Type.Literal(ChatDiscussionType.DEFAULT),
description: Type.String(),
},
{$id: 'DefaultChatDiscussion', ...strict},
);

/** CompareChatDiscussion input validation. */
export const CompareChatDiscussionData = Type.Object(
{
id: Type.String(),
type: Type.Literal(ChatDiscussionType.COMPARE),
description: Type.String(),
items: Type.Array(DiscussionItemData),
},
{$id: 'CompareChatDiscussion', ...strict},
);

/** ChatDiscussion input validation (discriminated union on `type`). */
export const ChatDiscussionData = Type.Union([
DefaultChatDiscussionData,
CompareChatDiscussionData,
]);

// ************************************************************************* //
// updateChatStageConfig endpoint //
// ************************************************************************* //
Expand All @@ -22,8 +64,7 @@ export const ChatStageConfigData = Type.Object(
progress: Type.Ref(StageProgressConfigSchema),
timeLimitInMinutes: Type.Union([Type.Number(), Type.Null()]),
requireFullTime: Type.Union([Type.Boolean(), Type.Null()]),
// discussions
// agents
discussions: Type.Array(ChatDiscussionData),
},
{$id: 'ChatStageConfig', ...strict},
);
Expand Down