Skip to main content

Domain Models

Iris uses Pydantic models extensively for request validation, serialization, and data transfer between Artemis and the pipeline system. All domain models live under src/iris/domain/.

DTO Hierarchy

The core DTO hierarchy follows a pattern where pipeline-specific DTOs extend a common base:

PipelineExecutionDTO                    # Base for all pipeline executions
├── ChatPipelineExecutionDTO # Base for chat pipelines
│ ├── ExerciseChatPipelineExecutionDTO
│ ├── CourseChatPipelineExecutionDTO
│ ├── LectureChatPipelineExecutionDTO
│ └── TextExerciseChatPipelineExecutionDTO
├── IngestionPipelineExecutionDto # Base for ingestion pipelines
├── CompetencyExtractionPipelineExecutionDTO
├── InconsistencyCheckPipelineExecutionDTO
├── RewritingPipelineExecutionDTO
└── ...

PipelineExecutionDTO

The base DTO that all pipeline execution requests extend:

class PipelineExecutionDTO(BaseModel):
settings: Optional[PipelineExecutionSettingsDTO]
initial_stages: Optional[list[StageDTO]] = Field(
default=None, alias="initialStages"
)
  • settings — Contains the Artemis base URL, authentication token, and variant selection.
  • initial_stages — Pipeline execution stages for progress tracking.

PipelineExecutionSettingsDTO

Carries execution context from Artemis:

class PipelineExecutionSettingsDTO(BaseModel):
authentication_token: str = Field(alias="authenticationToken")
artemis_llm_selection: str = Field(alias="selection", default="CLOUD_AI")
artemis_base_url: str = Field(alias="artemisBaseUrl")
variant: str = Field(default="default")
  • artemis_base_url — The URL of the Artemis instance making the request.
  • authentication_token — Used for callbacks to Artemis and as a run/session ID.
  • variant — The variant ID to use (defaults to "default").
  • artemis_llm_selection — Either "CLOUD_AI" or "LOCAL_AI", controls cloud vs. local model selection.

ChatPipelineExecutionDTO

Extends the base DTO with chat-specific fields:

class ChatPipelineExecutionDTO(PipelineExecutionDTO):
session_title: Optional[str] = Field(alias="sessionTitle", default=None)
chat_history: List[PyrisMessage] = Field(alias="chatHistory", default=[])
user: Optional[UserDTO]
  • chat_history — The conversation so far, as a list of PyrisMessage objects.
  • user — The student's user information (ID, name, language preference).
  • session_title — The current chat session title (may be updated by the pipeline).

Pipeline-specific Chat DTOs

Each chat pipeline adds its own context fields:

DTOExtra Fields
ExerciseChatPipelineExecutionDTOexercise, submission, course, custom_instructions
CourseChatPipelineExecutionDTOcourse (ExtendedCourseDTO), metrics, event_payload, custom_instructions
LectureChatPipelineExecutionDTOcourse, lecture (PyrisLectureDTO), lecture_unit_id, custom_instructions
TextExerciseChatPipelineExecutionDTOexercise (TextExerciseDTO), current_submission

Data Models

The domain/data/ directory contains models representing Artemis entities:

Course & Exercise Models

ModelFileKey Fields
CourseDTOcourse_dto.pyid, name, description
ExtendedCourseDTOextended_course_dto.pyExtends CourseDTO with exercises, lectures, FAQs
ProgrammingExerciseDTOprogramming_exercise_dto.pyid, title, problem_statement, programming_language
TextExerciseDTOtext_exercise_dto.pyid, title, problem_statement
ExerciseWithSubmissionsDTOexercise_with_submissions_dto.pyExercise with submission list

Submission & Feedback Models

ModelFileKey Fields
ProgrammingSubmissionDTOprogramming_submission_dto.pydate, repository, build_failed, latest_result
SimpleSubmissionDTOsimple_submission_dto.pyLightweight submission representation
ResultDTOresult_dto.pyTest results, score, feedbacks
FeedbackDTOfeedback_dto.pyIndividual test feedback with detail text
BuildLogEntrybuild_log_entry.pyBuild/compilation log entries

Lecture Models

ModelFileKey Fields
PyrisLectureDTOlecture_dto.pyid, title, units
PyrisLectureUnitDTOpyris_lecture_unit_dto.pyLecture unit with content
LectureUnitPageDTOlecture_unit_page_dto.pySingle page of a lecture unit

Message Models

ModelFilePurpose
TextMessageContentDTOtext_message_content_dto.pyText content in a message
ImageMessageContentDTOimage_message_content_dto.pyImage content in a message
JsonMessageContentDTOjson_message_content_dto.pyJSON content in a message
ToolCallDTOtool_call_dto.pyTool call representation
ToolMessageContentDTOtool_message_content_dto.pyTool result message

Other Models

ModelFilePurpose
UserDTOuser_dto.pyUser information (ID, name, language)
CompetencyDTOcompetency_dto.pyCourse competency definition
FaqDTOfaq_dto.pyFAQ question-answer pair
FeatureDTOfeature_dto.pyVariant feature description for Artemis

Data Flow

The typical data flow for a chat pipeline request:

Artemis (JSON) → FastAPI validates → DTO object → Pipeline.__call__(dto, variant, callback)

├── dto.chat_history → message_history
├── dto.exercise → tool context
├── dto.submission → tool context
└── dto.course → tool context
  1. Artemis sends JSON — Serialized with camelCase field names.
  2. FastAPI deserializes — Pydantic validates and converts to the DTO using field aliases.
  3. Pipeline reads DTO — Extracts chat history, user info, and domain-specific context.
  4. Tools read DTO fields — Exercise data, submissions, etc. are passed to tool factory functions.
  5. Response via callback — Results are sent back to Artemis through the StatusCallback.

Pydantic Conventions

Iris DTOs follow these conventions:

  • Field aliases — Artemis sends camelCase JSON; DTOs use snake_case with alias="camelCase":

    chat_history: List[PyrisMessage] = Field(alias="chatHistory", default=[])
  • populate_by_name = True — Models accept both the alias and the Python name:

    class Config:
    populate_by_name = True
  • Optional fields — Most fields are Optional with defaults, since Artemis may not always provide all data.

  • Validation — Pydantic v2 validators are used for complex validation (see config.py for an example with model_validator).

PyrisMessage

The shared message format used across all pipelines:

class PyrisMessage(BaseModel):
sender: IrisMessageRole # USER, ASSISTANT, SYSTEM
contents: list[MessageContentDTO] # Text, image, tool call, etc.

Messages are converted to LangChain format for the agent loop using convert_iris_message_to_langchain_message() from common/message_converters.py.