Skip to content

Commit ef0f620

Browse files
authored
Merge branch 'main' into staging/deploy
2 parents 3be4afd + 99de6a9 commit ef0f620

File tree

24 files changed

+1129
-657
lines changed

24 files changed

+1129
-657
lines changed

poetry.lock

Lines changed: 344 additions & 326 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ python-docx = "^1.1.2"
5353
python-calamine = "^0.2.3"
5454
structlog = "^24.4.0"
5555
pyyaml = "^6.0.1"
56+
nltk = "^3.9.1"
5657

5758
[tool.poetry.group.compass]
5859
optional = false

src/backend/routers/scim.py

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -62,27 +62,27 @@ async def get_users(
6262
db_user = user_crud.get_user_by_user_name(session, display_name)
6363
if not db_user:
6464
return ListUserResponse(
65-
totalResults=0,
66-
startIndex=start_index,
67-
itemsPerPage=count,
68-
Resources=[],
65+
total_results=0,
66+
start_index=start_index,
67+
items_per_page=count,
68+
resources=[],
6969
)
7070
return ListUserResponse(
71-
totalResults=1,
72-
startIndex=start_index,
73-
itemsPerPage=count,
74-
Resources=[User.from_db_user(db_user)],
71+
total_results=1,
72+
start_index=start_index,
73+
items_per_page=count,
74+
resources=[User.from_db_user(db_user)],
7575
)
7676

7777
db_users = user_crud.get_external_users(
7878
session, offset=start_index - 1, limit=count
7979
)
8080
users = [User.from_db_user(db_user) for db_user in db_users]
8181
return ListUserResponse(
82-
totalResults=len(users),
83-
startIndex=start_index,
84-
itemsPerPage=count,
85-
Resources=users,
82+
total_results=len(users),
83+
start_index=start_index,
84+
items_per_page=count,
85+
resources=users,
8686
)
8787

8888

@@ -105,8 +105,8 @@ async def create_user(user: CreateUser, session: DBSessionDep):
105105
if not db_user:
106106
db_user = DBUser()
107107

108-
db_user.user_name = user.userName
109-
db_user.fullname = f"{user.name.givenName} {user.name.familyName}"
108+
db_user.user_name = user.user_name
109+
db_user.fullname = f"{user.name.given_name} {user.name.family_name}"
110110
db_user.email = _get_email_from_scim_user(user)
111111
db_user.active = user.active
112112
db_user.external_id = user.externalId
@@ -128,8 +128,8 @@ async def update_user(
128128
logger.error(event="[SCIM] user not found", user_id=user_id)
129129
raise SCIMException(status_code=404, detail="User not found")
130130

131-
db_user.user_name = user.userName
132-
db_user.fullname = f"{user.name.givenName} {user.name.familyName}"
131+
db_user.user_name = user.user_name
132+
db_user.fullname = f"{user.name.given_name} {user.name.family_name}"
133133
db_user.active = user.active
134134
email_update = _get_email_from_scim_user(user)
135135
db_user.email = email_update
@@ -176,25 +176,25 @@ async def get_groups(
176176
db_group = group_crud.get_group_by_name(session, display_name)
177177
if not db_group:
178178
return ListGroupResponse(
179-
totalResults=0,
180-
startIndex=start_index,
181-
itemsPerPage=count,
182-
Resources=[],
179+
total_results=0,
180+
start_index=start_index,
181+
items_per_page=count,
182+
resources=[],
183183
)
184184
return ListGroupResponse(
185-
totalResults=1,
186-
startIndex=start_index,
187-
itemsPerPage=count,
188-
Resources=[Group.from_db_group(db_group)],
185+
total_results=1,
186+
start_index=start_index,
187+
items_per_page=count,
188+
resources=[Group.from_db_group(db_group)],
189189
)
190190

191191
db_groups = group_crud.get_groups(session, offset=start_index - 1, limit=count)
192192
groups = [Group.from_db_group(db_group) for db_group in db_groups]
193193
return ListGroupResponse(
194-
totalResults=len(groups),
195-
startIndex=start_index,
196-
itemsPerPage=count,
197-
Resources=groups,
194+
total_results=len(groups),
195+
start_index=start_index,
196+
items_per_page=count,
197+
resources=groups,
198198
)
199199

200200

@@ -213,11 +213,11 @@ async def get_group(
213213

214214
@router.post("/Groups", status_code=201)
215215
async def create_group(group: CreateGroup, session: DBSessionDep):
216-
db_group = group_crud.get_group_by_name(session, group.displayName)
216+
db_group = group_crud.get_group_by_name(session, group.display_name)
217217
if not db_group:
218218
db_group = DBGroup()
219219

220-
db_group.display_name = group.displayName
220+
db_group.display_name = group.display_name
221221

222222
db_group = group_crud.create_group(session, db_group)
223223
return Group.from_db_group(db_group)

src/backend/schemas/scim.py

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,54 @@
11
from typing import ClassVar, Dict, List, Optional, Union
22

3-
from pydantic import BaseModel
3+
from pydantic import BaseModel, ConfigDict, Field
4+
from pydantic.alias_generators import to_camel
45

56
from backend.database_models import Group as DBGroup
67
from backend.database_models import User as DBUser
78

89

9-
class Meta(BaseModel):
10-
resourceType: str
10+
class BaseSchema(BaseModel):
11+
model_config = ConfigDict(
12+
alias_generator=to_camel,
13+
populate_by_name=True,
14+
from_attributes=True,
15+
)
16+
17+
18+
class Meta(BaseSchema):
19+
resource_type: str
1120
created: str
12-
lastModified: str
21+
last_modified: str
1322

1423

15-
class Name(BaseModel):
16-
givenName: str
17-
familyName: str
24+
class Name(BaseSchema):
25+
given_name: str
26+
family_name: str
1827

1928

20-
class BaseUser(BaseModel):
21-
userName: Optional[str]
29+
class BaseUser(BaseSchema):
30+
user_name: Optional[str]
2231
active: Optional[bool]
2332

2433
schemas: list[str]
2534

2635

27-
class GroupMember(BaseModel):
36+
class GroupMember(BaseSchema):
2837
value: str
2938
display: str
3039

3140

32-
class BaseGroup(BaseModel):
41+
class BaseGroup(BaseSchema):
3342
schemas: list[str]
3443
members: list[GroupMember]
35-
displayName: str
44+
display_name: str
3645

3746

3847
class CreateGroup(BaseGroup):
3948
pass
4049

4150

42-
class Email(BaseModel):
51+
class Email(BaseSchema):
4352
primary: bool
4453
value: Optional[str] = None
4554
type: str
@@ -56,37 +65,37 @@ class UpdateUser(BaseUser):
5665
name: Name
5766

5867

59-
class Operation(BaseModel):
68+
class Operation(BaseSchema):
6069
op: str
6170
value: dict[str, bool]
6271

6372

64-
class GroupOperation(BaseModel):
73+
class GroupOperation(BaseSchema):
6574
op: str
6675
path: Optional[str] = None
6776
value: Union[Dict[str, str], list[Dict[str, str]]]
6877

6978

70-
class PatchUser(BaseModel):
79+
class PatchUser(BaseSchema):
7180
schemas: list[str]
7281
Operations: list[Operation]
7382

7483

75-
class PatchGroup(BaseModel):
84+
class PatchGroup(BaseSchema):
7685
schemas: list[str]
7786
Operations: list[GroupOperation]
7887

7988

8089
class Group(BaseGroup):
8190
id: str
82-
displayName: str
91+
display_name: str
8392
meta: Meta
8493

8594
@staticmethod
8695
def from_db_group(db_group: DBGroup) -> "Group":
8796
return Group(
8897
id=db_group.id,
89-
displayName=db_group.display_name,
98+
display_name=db_group.display_name,
9099
members=[
91100
GroupMember(value=ua.user_id, display=ua.display)
92101
for ua in db_group.user_associations
@@ -102,16 +111,16 @@ def from_db_group(db_group: DBGroup) -> "Group":
102111

103112
class User(BaseUser):
104113
id: str
105-
externalId: str
114+
external_id: str
106115
meta: Meta
107116

108117
@staticmethod
109118
def from_db_user(db_user: DBUser) -> "User":
110119
return User(
111120
id=db_user.id,
112-
userName=db_user.user_name,
121+
user_name=db_user.user_name,
113122
active=db_user.active,
114-
externalId=db_user.external_id,
123+
external_id=db_user.external_id,
115124
meta=Meta(
116125
resourceType="User",
117126
created=db_user.created_at.isoformat(),
@@ -121,18 +130,18 @@ def from_db_user(db_user: DBUser) -> "User":
121130
)
122131

123132

124-
class BaseListResponse(BaseModel):
133+
class BaseListResponse(BaseSchema):
125134
schemas: ClassVar[list[str]] = [
126135
"urn:ietf:params:scim:api:messages:2.0:ListResponse"
127136
]
128-
totalResults: int
129-
startIndex: int
130-
itemsPerPage: int
137+
total_results: int
138+
start_index: int
139+
items_per_page: int
131140

132141

133142
class ListUserResponse(BaseListResponse):
134-
Resources: list[User]
143+
resources: list[User] = Field(alias='Resources')
135144

136145

137146
class ListGroupResponse(BaseListResponse):
138-
Resources: list[Group]
147+
resources: list[Group] = Field(alias='Resources')

src/interfaces/assistants_web/package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/interfaces/assistants_web/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"@types/mdast": "^4.0.3",
4141
"@types/react": "^18.2.18",
4242
"autoprefixer": "^10.4.7",
43-
"axios": "^1.6.7",
43+
"axios": "^1.7.4",
4444
"classnames": "^2.5.1",
4545
"cross-fetch": "^3.1.8",
4646
"csstype": "^3.0.10",
@@ -122,4 +122,4 @@
122122
"storybook": "^8.2.6",
123123
"vitest": "^2.0.5"
124124
}
125-
}
125+
}

src/interfaces/assistants_web/src/app/(main)/(chat)/Chat.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { useConversation } from '@/hooks/conversation';
1111
import { useListTools } from '@/hooks/tools';
1212
import { useCitationsStore, useConversationStore, useParamsStore } from '@/stores';
1313
import { OutputFiles } from '@/stores/slices/citationsSlice';
14-
import { createStartEndKey, mapHistoryToMessages } from '@/utils';
14+
import { createStartEndKey, fixCitationsLeadingMarkdown, mapHistoryToMessages } from '@/utils';
1515
import { parsePythonInterpreterToolFields } from '@/utils/tools';
1616

1717
const Chat: React.FC<{ agentId?: string; conversationId?: string }> = ({
@@ -85,7 +85,7 @@ const Chat: React.FC<{ agentId?: string; conversationId?: string }> = ({
8585
}
8686
}
8787
});
88-
message.citations?.forEach((citation) => {
88+
fixCitationsLeadingMarkdown(message.citations, message.text)?.forEach((citation) => {
8989
const startEndKey = createStartEndKey(citation.start ?? 0, citation.end ?? 0);
9090
const documents = citation.document_ids?.map((id) => documentsMap[id]) ?? [];
9191
addCitation(message.generation_id ?? '', startEndKey, documents);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { AgentPublic } from '@/cohere-client';
2+
import { CoralLogo, Text } from '@/components/Shared';
3+
import { useBrandedColors } from '@/hooks/brandedColors';
4+
import { cn } from '@/utils';
5+
6+
export const AgentLogo = ({ agent }: { agent: AgentPublic }) => {
7+
const isBaseAgent = !agent.id;
8+
const { bg, contrastText, contrastFill } = useBrandedColors(agent.id);
9+
10+
return (
11+
<div className={cn('flex size-5 flex-shrink-0 items-center justify-center rounded', bg)}>
12+
{isBaseAgent && <CoralLogo className={cn(contrastFill, 'size-3')} />}
13+
{!isBaseAgent && (
14+
<Text className={cn('uppercase', contrastText)} styleAs="p-sm">
15+
{agent.name[0]}
16+
</Text>
17+
)}
18+
</div>
19+
);
20+
};

0 commit comments

Comments
 (0)