Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
b02c5ce
Add initial specs
jp-agenta Feb 22, 2026
4597b83
Clean up Testsets/Testcases
jp-agenta Feb 22, 2026
b2580af
Clean up Queries/Traces
jp-agenta Feb 22, 2026
0d9a295
cleaning up strategies docs
jp-agenta Feb 23, 2026
224938b
Add gap analysis and tests
jp-agenta Feb 23, 2026
87193e0
Fixing loadables tests
jp-agenta Feb 23, 2026
ced1a5d
quick CR
jp-agenta Feb 23, 2026
fe3c7c7
Merge branch 'main' into feat/extend-loadables-in-api
jp-agenta Feb 23, 2026
3715bc1
Add PR.md
jp-agenta Feb 23, 2026
62b282a
some clean-up
jp-agenta Feb 25, 2026
91d059c
more clean-up
jp-agenta Feb 25, 2026
b5a8e81
cleanup ongoing
jp-agenta Feb 25, 2026
4c98a29
major clean up
jp-agenta Feb 26, 2026
f243126
Add initial CRs
jp-agenta Feb 26, 2026
a1f26dc
Merge branch 'main' into feat/extend-loadables-in-api
jp-agenta Feb 26, 2026
22ca4b6
second pass after merging main
jp-agenta Feb 26, 2026
23b68c7
ruff format
jp-agenta Feb 26, 2026
cb5efab
consolidate
jp-agenta Feb 27, 2026
2a29170
cleanup CR
jp-agenta Feb 27, 2026
46009c9
Fix P0
jp-agenta Feb 27, 2026
62d8a99
Fix P1
jp-agenta Feb 27, 2026
db7946c
Fix P3
jp-agenta Feb 27, 2026
3b55359
fix comments
jp-agenta Feb 27, 2026
d3af46b
fix devin comments
jp-agenta Feb 27, 2026
c4b019c
fix devin comments
jp-agenta Feb 27, 2026
49fe372
merge main
jp-agenta Feb 27, 2026
ebd39f0
merge main conflict
jp-agenta Feb 27, 2026
37810de
Merge branch 'chore/extend-testing-docs' into feat/extend-loadables-i…
jp-agenta Mar 2, 2026
0e39bbb
Fix one test
jp-agenta Mar 2, 2026
26ff65d
Adding tests
jp-agenta Mar 2, 2026
175b12d
Merge branch 'release/v0.87.3' into feat/extend-loadables-in-api
jp-agenta Mar 2, 2026
ae1ada1
Merge branch 'release/v0.87.3' into feat/extend-loadables-in-api
jp-agenta Mar 2, 2026
aa6dc6e
ruff format
jp-agenta Mar 2, 2026
bbdaa94
fix testsets parsing
jp-agenta Mar 2, 2026
263e00f
fix all tests
jp-agenta Mar 3, 2026
3d6d612
Fix devin comments
jp-agenta Mar 3, 2026
8a001b9
fix last devin issue
jp-agenta Mar 3, 2026
e338524
Fix AND/OR
jp-agenta Mar 3, 2026
f2d8446
Fix devin issues
jp-agenta Mar 3, 2026
27861fe
Fix jsonify/stringify inputs
jp-agenta Mar 3, 2026
44b6e42
devin fixes
jp-agenta Mar 3, 2026
40d5f17
merge feat/add-embeds
jp-agenta Mar 3, 2026
0f4245c
Fix devin comments
jp-agenta Mar 3, 2026
5b9a919
Merge branch 'release/v0.91.0' into feat/extend-loadables-in-api
jp-agenta Mar 6, 2026
968941e
Merge branch 'release/v0.92.0' into feat/extend-loadables-in-api
junaway Mar 6, 2026
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
2 changes: 2 additions & 0 deletions .gitleaksignore
Original file line number Diff line number Diff line change
Expand Up @@ -280,3 +280,5 @@ bb4b06cd13e5aca1c75886990f164b643360da2b:sdk/tests/legacy/debugging/simple-app/c
9b02348e6037157ba341bdcb1b7e11f55689ac13:docs/design/agents-feature/pre-research/research-vellum-composio-api.md:generic-api-key:366
8bf2b0643b024e17904269830d941cb324a26b0f:docs/design/agents-feature/research-composio-oauth.md:curl-auth-header:150
ce2aa0c2d9990d25d5771b65e0fad6db01518e14:sdk/tests/integration/conftest.py:agenta-api-key:23
a00f015276504fbf7a4820b26d17eb725c63635b:bench_traces.py:generic-api-key:19
a00f015276504fbf7a4820b26d17eb725c63635b:bench_bulk_insert.py:generic-api-key:304
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@
from oss.src.core.testcases.dtos import Testcase
from oss.src.core.testcases.service import TestcasesService
from oss.src.models.deprecated_models import DeprecatedTestsetDB
from oss.src.core.testsets.dtos import TestsetRevisionCommit, TestsetRevisionData
from oss.src.core.testsets.dtos import (
TestsetRevisionCommit,
TestsetRevisionData,
SimpleTestsetCreate,
)
from oss.src.core.testsets.service import TestsetsService, SimpleTestsetsService


Expand Down Expand Up @@ -197,6 +201,39 @@ def _jsonify_testcase_fields(testcases: Optional[List[Testcase]]) -> bool:
return changed


async def _transfer_deprecated_testset(
*,
deprecated_testset: DeprecatedTestsetDB,
user_id: UUID,
) -> Optional[object]:
"""
Migration-local replacement for the removed SimpleTestsetsService.transfer().
Creates a new-style simple testset from deprecated `testsets.csvdata`
while preserving the original testset id.
"""
if deprecated_testset.project_id is None:
return None

csvdata = deprecated_testset.csvdata
rows = csvdata if isinstance(csvdata, list) else []
testcases = [Testcase(data=row) for row in rows if isinstance(row, dict)]

simple_testset_create = SimpleTestsetCreate(
slug=uuid4().hex[-12:],
name=deprecated_testset.name,
data=TestsetRevisionData(testcases=testcases),
)

return await simple_testsets_service.create(
project_id=deprecated_testset.project_id,
user_id=user_id,
#
simple_testset_create=simple_testset_create,
#
testset_id=deprecated_testset.id,
)


async def _commit_jsonified_revision(
*,
project_id: UUID,
Expand Down Expand Up @@ -326,10 +363,9 @@ async def migration_old_testsets_to_new_testsets(
)
continue

new_testset = await simple_testsets_service.transfer(
project_id=testset.project_id,
new_testset = await _transfer_deprecated_testset(
deprecated_testset=testset,
user_id=owner,
testset_id=testset.id,
)
if not new_testset:
skipped_records += 1
Expand Down
2 changes: 1 addition & 1 deletion api/ee/src/apis/fastapi/billing/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
SwitchException,
EventException,
)
from ee.src.models.api.organization_models import OrganizationUpdate
from ee.src.core.organizations.types import OrganizationUpdate


log = get_module_logger(__name__)
Expand Down
41 changes: 38 additions & 3 deletions api/ee/src/apis/fastapi/organizations/router.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from typing import List
from uuid import UUID

from fastapi import APIRouter, Request, HTTPException
from fastapi.responses import JSONResponse, Response
Expand All @@ -17,6 +18,11 @@
OrganizationDomainsService,
OrganizationProvidersService,
)
from ee.src.core.organizations.types import (
OrganizationDomainCreate as OrganizationDomainCreateDTO,
OrganizationProviderCreate as OrganizationProviderCreateDTO,
OrganizationProviderUpdate as OrganizationProviderUpdateDTO,
)

from ee.src.apis.fastapi.organizations.models import (
OrganizationDomainCreate,
Expand Down Expand Up @@ -107,7 +113,16 @@ async def create_domain(
if not check:
return NOT_ENTITLED_RESPONSE(Tracker.FLAGS)

domain = await domain_service.create_domain(organization_id, payload, user_id)
domain = await domain_service.create_domain(
organization_id,
OrganizationDomainCreateDTO(
slug=payload.domain,
name=payload.name,
description=payload.description,
organization_id=UUID(organization_id),
),
user_id,
)

return JSONResponse(
status_code=201,
Expand Down Expand Up @@ -298,7 +313,18 @@ async def create_provider(

await require_email_or_social_or_root_enabled(organization_id)

return await provider_service.create_provider(organization_id, payload, user_id)
return await provider_service.create_provider(
organization_id,
OrganizationProviderCreateDTO(
slug=payload.slug,
name=payload.name,
description=payload.description,
flags=payload.flags,
settings=payload.settings,
organization_id=UUID(organization_id),
),
user_id,
)


@router.patch(
Expand Down Expand Up @@ -327,7 +353,16 @@ async def update_provider(
await require_email_or_social_or_root_enabled(organization_id)

return await provider_service.update_provider(
organization_id, provider_id, payload, user_id
organization_id,
provider_id,
OrganizationProviderUpdateDTO(
slug=payload.slug,
name=payload.name,
description=payload.description,
flags=payload.flags,
settings=payload.settings,
),
user_id,
)


Expand Down
49 changes: 48 additions & 1 deletion api/ee/src/core/organizations/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,52 @@
from uuid import UUID
from datetime import datetime

from pydantic import BaseModel
from pydantic import BaseModel, ConfigDict, Field


# ============================================================================
# ORGANIZATIONS
# ============================================================================


class Organization(BaseModel):
id: UUID
slug: Optional[str] = None

name: Optional[str] = None
description: Optional[str] = None

flags: Optional[Dict[str, Any]] = None
tags: Optional[Dict[str, Any]] = None
meta: Optional[Dict[str, Any]] = None

owner_id: UUID

members: list[str] = Field(default_factory=list)
invitations: list = Field(default_factory=list)
workspaces: list[str] = Field(default_factory=list)

model_config = ConfigDict(from_attributes=True)


class CreateOrganization(BaseModel):
name: Optional[str] = None
description: Optional[str] = None

is_demo: bool = False

owner_id: UUID


class OrganizationUpdate(BaseModel):
slug: Optional[str] = None

name: Optional[str] = None
description: Optional[str] = None

flags: Optional[Dict[str, Any]] = None

updated_at: Optional[str] = None


# ============================================================================
Expand Down Expand Up @@ -90,6 +135,8 @@ class OrganizationProviderCreate(BaseModel):


class OrganizationProviderUpdate(BaseModel):
slug: Optional[str] = None

name: Optional[str] = None
description: Optional[str] = None

Expand Down
Empty file.
59 changes: 59 additions & 0 deletions api/ee/src/core/workspaces/types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
from datetime import datetime
from typing import Any, Dict, List, Optional

from pydantic import BaseModel

from ee.src.models.shared_models import Permission, WorkspaceRole


class WorkspacePermission(BaseModel):
role_name: WorkspaceRole
role_description: Optional[str] = None
permissions: Optional[List[Permission]] = None


class WorkspaceMember(BaseModel):
user_id: str
roles: List[WorkspacePermission]


class WorkspaceMemberResponse(BaseModel):
user: Dict[str, Any]
roles: List[WorkspacePermission]


class WorkspaceResponse(BaseModel):
id: str

name: Optional[str] = None
description: Optional[str] = None

type: Optional[str]

organization: str

members: Optional[List[WorkspaceMemberResponse]] = None

created_at: str
updated_at: str


class CreateWorkspace(BaseModel):
name: Optional[str] = None
description: Optional[str] = None

type: Optional[str] = None


class UserRole(BaseModel):
email: str
role: Optional[str] = None

organization_id: str


class UpdateWorkspace(BaseModel):
name: Optional[str] = None
description: Optional[str] = None

updated_at: Optional[datetime] = None
17 changes: 15 additions & 2 deletions api/ee/src/routers/organization_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
OrganizationDomainCreate,
OrganizationProviderCreate,
OrganizationProviderUpdate,
OrganizationUpdate as OrganizationUpdateDTO,
)
from ee.src.core.organizations.exceptions import OrganizationSlugConflictError

Expand Down Expand Up @@ -195,7 +196,16 @@ async def update_organization(
if not check:
return NOT_ENTITLED_RESPONSE(Tracker.FLAGS)

organization = await update_an_organization(organization_id, payload)
organization = await update_an_organization(
organization_id,
OrganizationUpdateDTO(
slug=payload.slug,
name=payload.name,
description=payload.description,
flags=payload.flags,
updated_at=payload.updated_at,
),
)

return organization

Expand Down Expand Up @@ -562,7 +572,10 @@ async def create_organization_domain(
domain_service = OrganizationDomainsService()
created_domain = await domain_service.create_domain(
organization_id=organization_id,
payload=OrganizationDomainCreate(domain=domain),
payload=OrganizationDomainCreate(
slug=domain,
organization_id=UUID(organization_id),
),
user_id=str(request.state.user_id),
)

Expand Down
2 changes: 1 addition & 1 deletion api/ee/src/services/commoners.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
add_user_to_workspace,
add_user_to_project,
)
from ee.src.models.api.organization_models import CreateOrganization
from ee.src.core.organizations.types import CreateOrganization
from oss.src.services.user_service import (
create_new_user,
delete_user,
Expand Down
3 changes: 2 additions & 1 deletion api/ee/src/services/converters.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@

from oss.src.services import db_manager
from ee.src.services import db_manager_ee
from ee.src.models.api.workspace_models import WorkspaceRole, WorkspaceResponse
from ee.src.core.workspaces.types import WorkspaceResponse
from ee.src.models.shared_models import Permission
from ee.src.models.shared_models import WorkspaceRole
from oss.src.models.db_models import WorkspaceDB


Expand Down
4 changes: 2 additions & 2 deletions api/ee/src/services/db_manager_ee.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@

from oss.src.dbs.postgres.shared.engine import engine
from oss.src.services import db_manager
from ee.src.models.api.workspace_models import (
from ee.src.core.workspaces.types import (
UserRole,
UpdateWorkspace,
CreateWorkspace,
WorkspaceResponse,
)
from ee.src.models.api.organization_models import (
from ee.src.core.organizations.types import (
Organization,
CreateOrganization,
OrganizationUpdate,
Expand Down
Loading
Loading