devrev-Python-SDK 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. devrev/__init__.py +47 -0
  2. devrev/client.py +343 -0
  3. devrev/config.py +180 -0
  4. devrev/exceptions.py +205 -0
  5. devrev/models/__init__.py +499 -0
  6. devrev/models/accounts.py +187 -0
  7. devrev/models/articles.py +109 -0
  8. devrev/models/base.py +147 -0
  9. devrev/models/code_changes.py +103 -0
  10. devrev/models/conversations.py +115 -0
  11. devrev/models/dev_users.py +258 -0
  12. devrev/models/groups.py +140 -0
  13. devrev/models/links.py +107 -0
  14. devrev/models/parts.py +110 -0
  15. devrev/models/rev_users.py +177 -0
  16. devrev/models/slas.py +112 -0
  17. devrev/models/tags.py +90 -0
  18. devrev/models/timeline_entries.py +100 -0
  19. devrev/models/webhooks.py +109 -0
  20. devrev/models/works.py +280 -0
  21. devrev/py.typed +1 -0
  22. devrev/services/__init__.py +74 -0
  23. devrev/services/accounts.py +325 -0
  24. devrev/services/articles.py +80 -0
  25. devrev/services/base.py +234 -0
  26. devrev/services/code_changes.py +80 -0
  27. devrev/services/conversations.py +98 -0
  28. devrev/services/dev_users.py +401 -0
  29. devrev/services/groups.py +103 -0
  30. devrev/services/links.py +68 -0
  31. devrev/services/parts.py +100 -0
  32. devrev/services/rev_users.py +235 -0
  33. devrev/services/slas.py +82 -0
  34. devrev/services/tags.py +80 -0
  35. devrev/services/timeline_entries.py +80 -0
  36. devrev/services/webhooks.py +80 -0
  37. devrev/services/works.py +363 -0
  38. devrev/utils/__init__.py +14 -0
  39. devrev/utils/deprecation.py +49 -0
  40. devrev/utils/http.py +521 -0
  41. devrev/utils/logging.py +139 -0
  42. devrev/utils/pagination.py +155 -0
  43. devrev_python_sdk-1.0.0.dist-info/METADATA +774 -0
  44. devrev_python_sdk-1.0.0.dist-info/RECORD +45 -0
  45. devrev_python_sdk-1.0.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,187 @@
1
+ """Account models for DevRev SDK.
2
+
3
+ This module contains Pydantic models for Account-related API operations.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from datetime import datetime
9
+ from enum import Enum
10
+ from typing import Any
11
+
12
+ from pydantic import Field
13
+
14
+ from devrev.models.base import (
15
+ CustomSchemaSpec,
16
+ DateFilter,
17
+ DevRevBaseModel,
18
+ DevRevResponseModel,
19
+ PaginatedResponse,
20
+ StageInfo,
21
+ TagWithValue,
22
+ UserSummary,
23
+ )
24
+
25
+
26
+ class AccountTier(str, Enum):
27
+ """Account tier enumeration."""
28
+
29
+ TIER1 = "tier-1"
30
+ TIER2 = "tier-2"
31
+ TIER3 = "tier-3"
32
+
33
+
34
+ class Account(DevRevResponseModel):
35
+ """DevRev Account model.
36
+
37
+ Represents a customer account in DevRev.
38
+ """
39
+
40
+ id: str = Field(..., description="Account ID")
41
+ display_id: str | None = Field(default=None, description="Human-readable display ID")
42
+ display_name: str | None = Field(default=None, description="Account display name")
43
+ description: str | None = Field(default=None, description="Account description")
44
+ created_date: datetime | None = Field(default=None, description="Creation timestamp")
45
+ modified_date: datetime | None = Field(default=None, description="Last modification timestamp")
46
+ created_by: UserSummary | None = Field(default=None, description="User who created the account")
47
+ modified_by: UserSummary | None = Field(
48
+ default=None, description="User who last modified the account"
49
+ )
50
+ owned_by: list[UserSummary] | None = Field(default=None, description="Account owners")
51
+ domains: list[str] | None = Field(default=None, description="Associated domains")
52
+ external_refs: list[str] | None = Field(default=None, description="External references")
53
+ stage: StageInfo | None = Field(default=None, description="Account stage")
54
+ tags: list[TagWithValue] | None = Field(default=None, description="Account tags")
55
+ tier: str | None = Field(default=None, description="Account tier")
56
+ custom_fields: dict[str, Any] | None = Field(default=None, description="Custom fields")
57
+
58
+
59
+ class AccountSummary(DevRevResponseModel):
60
+ """Summary of an Account for list/reference operations."""
61
+
62
+ id: str = Field(..., description="Account ID")
63
+ display_id: str | None = Field(default=None, description="Human-readable display ID")
64
+ display_name: str | None = Field(default=None, description="Account display name")
65
+
66
+
67
+ # Request Models
68
+
69
+
70
+ class AccountsCreateRequest(DevRevBaseModel):
71
+ """Request to create an account."""
72
+
73
+ display_name: str = Field(..., description="Account display name", min_length=1, max_length=256)
74
+ description: str | None = Field(
75
+ default=None, description="Account description", max_length=65536
76
+ )
77
+ domains: list[str] | None = Field(default=None, description="Associated domains")
78
+ external_refs: list[str] | None = Field(default=None, description="External references")
79
+ owned_by: list[str] | None = Field(default=None, description="Owner user IDs")
80
+ tier: str | None = Field(default=None, description="Account tier")
81
+ custom_fields: dict[str, Any] | None = Field(default=None, description="Custom fields")
82
+ custom_schema_spec: CustomSchemaSpec | None = Field(
83
+ default=None, description="Custom schema spec"
84
+ )
85
+
86
+
87
+ class AccountsGetRequest(DevRevBaseModel):
88
+ """Request to get an account by ID."""
89
+
90
+ id: str = Field(..., description="Account ID")
91
+
92
+
93
+ class AccountsListRequest(DevRevBaseModel):
94
+ """Request to list accounts."""
95
+
96
+ created_by: list[str] | None = Field(default=None, description="Filter by creator user IDs")
97
+ created_date: DateFilter | None = Field(default=None, description="Filter by creation date")
98
+ cursor: str | None = Field(default=None, description="Pagination cursor")
99
+ display_name: list[str] | None = Field(default=None, description="Filter by display names")
100
+ domains: list[str] | None = Field(default=None, description="Filter by domains")
101
+ external_refs: list[str] | None = Field(default=None, description="Filter by external refs")
102
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results to return")
103
+ modified_date: DateFilter | None = Field(
104
+ default=None, description="Filter by modification date"
105
+ )
106
+ owned_by: list[str] | None = Field(default=None, description="Filter by owner user IDs")
107
+ sort_by: list[str] | None = Field(default=None, description="Sort order")
108
+ stage_name: list[str] | None = Field(default=None, description="Filter by stage names")
109
+ tags: list[str] | None = Field(default=None, description="Filter by tag IDs")
110
+
111
+
112
+ class AccountsUpdateRequest(DevRevBaseModel):
113
+ """Request to update an account."""
114
+
115
+ id: str = Field(..., description="Account ID")
116
+ display_name: str | None = Field(default=None, description="New display name")
117
+ description: str | None = Field(default=None, description="New description")
118
+ tier: str | None = Field(default=None, description="New tier")
119
+ custom_fields: dict[str, Any] | None = Field(
120
+ default=None, description="Custom fields to update"
121
+ )
122
+
123
+
124
+ class AccountsDeleteRequest(DevRevBaseModel):
125
+ """Request to delete an account."""
126
+
127
+ id: str = Field(..., description="Account ID to delete")
128
+
129
+
130
+ class AccountsMergeRequest(DevRevBaseModel):
131
+ """Request to merge two accounts."""
132
+
133
+ primary_account: str = Field(..., description="Primary account ID (will be retained)")
134
+ secondary_account: str = Field(..., description="Secondary account ID (will be merged)")
135
+
136
+
137
+ class AccountsExportRequest(DevRevBaseModel):
138
+ """Request to export accounts."""
139
+
140
+ created_by: list[str] | None = Field(default=None, description="Filter by creator user IDs")
141
+ created_date: DateFilter | None = Field(default=None, description="Filter by creation date")
142
+ first: int | None = Field(default=None, ge=1, le=10000, description="Max results")
143
+
144
+
145
+ # Response Models
146
+
147
+
148
+ class AccountsCreateResponse(DevRevResponseModel):
149
+ """Response from creating an account."""
150
+
151
+ account: Account = Field(..., description="Created account")
152
+
153
+
154
+ class AccountsGetResponse(DevRevResponseModel):
155
+ """Response from getting an account."""
156
+
157
+ account: Account = Field(..., description="Retrieved account")
158
+
159
+
160
+ class AccountsListResponse(PaginatedResponse):
161
+ """Response from listing accounts."""
162
+
163
+ accounts: list[Account] = Field(..., description="List of accounts")
164
+
165
+
166
+ class AccountsUpdateResponse(DevRevResponseModel):
167
+ """Response from updating an account."""
168
+
169
+ account: Account = Field(..., description="Updated account")
170
+
171
+
172
+ class AccountsDeleteResponse(DevRevResponseModel):
173
+ """Response from deleting an account."""
174
+
175
+ pass # Empty response body
176
+
177
+
178
+ class AccountsMergeResponse(DevRevResponseModel):
179
+ """Response from merging accounts."""
180
+
181
+ account: Account = Field(..., description="Merged account")
182
+
183
+
184
+ class AccountsExportResponse(DevRevResponseModel):
185
+ """Response from exporting accounts."""
186
+
187
+ accounts: list[Account] = Field(..., description="Exported accounts")
@@ -0,0 +1,109 @@
1
+ """Article models for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+ from enum import Enum
7
+
8
+ from pydantic import Field
9
+
10
+ from devrev.models.base import (
11
+ DevRevBaseModel,
12
+ DevRevResponseModel,
13
+ PaginatedResponse,
14
+ UserSummary,
15
+ )
16
+
17
+
18
+ class ArticleStatus(str, Enum):
19
+ """Article status enumeration."""
20
+
21
+ DRAFT = "draft"
22
+ PUBLISHED = "published"
23
+ ARCHIVED = "archived"
24
+
25
+
26
+ class Article(DevRevResponseModel):
27
+ """DevRev Article model."""
28
+
29
+ id: str = Field(..., description="Article ID")
30
+ display_id: str | None = Field(default=None, description="Display ID")
31
+ title: str = Field(..., description="Article title")
32
+ content: str | None = Field(default=None, description="Article content")
33
+ status: ArticleStatus | None = Field(default=None, description="Article status")
34
+ authored_by: UserSummary | None = Field(default=None, description="Author")
35
+ created_date: datetime | None = Field(default=None, description="Creation date")
36
+ modified_date: datetime | None = Field(default=None, description="Last modified")
37
+
38
+
39
+ class ArticleSummary(DevRevResponseModel):
40
+ """Summary of an Article."""
41
+
42
+ id: str = Field(..., description="Article ID")
43
+ title: str | None = Field(default=None, description="Article title")
44
+
45
+
46
+ class ArticlesCreateRequest(DevRevBaseModel):
47
+ """Request to create an article."""
48
+
49
+ title: str = Field(..., description="Article title")
50
+ content: str | None = Field(default=None, description="Article content")
51
+ status: ArticleStatus | None = Field(default=None, description="Article status")
52
+
53
+
54
+ class ArticlesGetRequest(DevRevBaseModel):
55
+ """Request to get an article by ID."""
56
+
57
+ id: str = Field(..., description="Article ID")
58
+
59
+
60
+ class ArticlesDeleteRequest(DevRevBaseModel):
61
+ """Request to delete an article."""
62
+
63
+ id: str = Field(..., description="Article ID to delete")
64
+
65
+
66
+ class ArticlesListRequest(DevRevBaseModel):
67
+ """Request to list articles."""
68
+
69
+ cursor: str | None = Field(default=None, description="Pagination cursor")
70
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
71
+
72
+
73
+ class ArticlesUpdateRequest(DevRevBaseModel):
74
+ """Request to update an article."""
75
+
76
+ id: str = Field(..., description="Article ID")
77
+ title: str | None = Field(default=None, description="New title")
78
+ content: str | None = Field(default=None, description="New content")
79
+ status: ArticleStatus | None = Field(default=None, description="New status")
80
+
81
+
82
+ class ArticlesCreateResponse(DevRevResponseModel):
83
+ """Response from creating an article."""
84
+
85
+ article: Article = Field(..., description="Created article")
86
+
87
+
88
+ class ArticlesGetResponse(DevRevResponseModel):
89
+ """Response from getting an article."""
90
+
91
+ article: Article = Field(..., description="Retrieved article")
92
+
93
+
94
+ class ArticlesListResponse(PaginatedResponse):
95
+ """Response from listing articles."""
96
+
97
+ articles: list[Article] = Field(..., description="List of articles")
98
+
99
+
100
+ class ArticlesUpdateResponse(DevRevResponseModel):
101
+ """Response from updating an article."""
102
+
103
+ article: Article = Field(..., description="Updated article")
104
+
105
+
106
+ class ArticlesDeleteResponse(DevRevResponseModel):
107
+ """Response from deleting an article."""
108
+
109
+ pass
devrev/models/base.py ADDED
@@ -0,0 +1,147 @@
1
+ """Base Pydantic models and configuration for DevRev SDK.
2
+
3
+ This module provides base classes and shared configuration for all models.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from datetime import datetime
9
+
10
+ from pydantic import BaseModel, ConfigDict, Field
11
+
12
+
13
+ class DevRevBaseModel(BaseModel):
14
+ """Base model for all DevRev API models.
15
+
16
+ Provides consistent configuration across all models:
17
+ - Strict validation
18
+ - Extra fields forbidden
19
+ - Alias population from camelCase
20
+ """
21
+
22
+ model_config = ConfigDict(
23
+ extra="forbid",
24
+ populate_by_name=True,
25
+ str_strip_whitespace=True,
26
+ validate_assignment=True,
27
+ )
28
+
29
+
30
+ class DevRevResponseModel(DevRevBaseModel):
31
+ """Base model for API responses.
32
+
33
+ Allows extra fields to handle unknown API additions gracefully.
34
+ """
35
+
36
+ model_config = ConfigDict(
37
+ extra="ignore",
38
+ populate_by_name=True,
39
+ str_strip_whitespace=True,
40
+ )
41
+
42
+
43
+ class PaginatedResponse(DevRevResponseModel):
44
+ """Base model for paginated API responses."""
45
+
46
+ next_cursor: str | None = Field(
47
+ default=None,
48
+ description="Cursor for fetching next page of results",
49
+ )
50
+ prev_cursor: str | None = Field(
51
+ default=None,
52
+ description="Cursor for fetching previous page of results",
53
+ )
54
+
55
+
56
+ class DateFilter(DevRevBaseModel):
57
+ """Date filter for API requests."""
58
+
59
+ after: datetime | None = Field(
60
+ default=None,
61
+ description="Filter for objects after this timestamp",
62
+ )
63
+ before: datetime | None = Field(
64
+ default=None,
65
+ description="Filter for objects before this timestamp",
66
+ )
67
+
68
+
69
+ class DateTimeFilter(DevRevBaseModel):
70
+ """DateTime filter for API requests with preset options."""
71
+
72
+ after: datetime | None = Field(
73
+ default=None,
74
+ description="Filter for objects after this timestamp",
75
+ )
76
+ before: datetime | None = Field(
77
+ default=None,
78
+ description="Filter for objects before this timestamp",
79
+ )
80
+ preset: str | None = Field(
81
+ default=None,
82
+ description="Preset time period filter",
83
+ )
84
+
85
+
86
+ class UserSummary(DevRevResponseModel):
87
+ """Summary of a DevRev user."""
88
+
89
+ id: str = Field(..., description="User ID")
90
+ display_name: str | None = Field(default=None, description="User's display name")
91
+ email: str | None = Field(default=None, description="User's email address")
92
+ full_name: str | None = Field(default=None, description="User's full name")
93
+
94
+
95
+ class OrgSummary(DevRevResponseModel):
96
+ """Summary of a DevRev organization."""
97
+
98
+ id: str = Field(..., description="Organization ID")
99
+ display_name: str | None = Field(default=None, description="Organization's display name")
100
+
101
+
102
+ class ObjectSummary(DevRevResponseModel):
103
+ """Summary of a generic DevRev object (used for link source/target)."""
104
+
105
+ id: str = Field(..., description="Object ID")
106
+ display_id: str | None = Field(default=None, description="Display ID")
107
+ type: str | None = Field(default=None, description="Object type")
108
+
109
+
110
+ class TagWithValue(DevRevResponseModel):
111
+ """Tag with value for resource tagging."""
112
+
113
+ tag: str = Field(..., description="Tag name or ID")
114
+ value: str | None = Field(default=None, description="Tag value")
115
+
116
+
117
+ class SetTagWithValue(DevRevBaseModel):
118
+ """Tag with value for setting tags on resources."""
119
+
120
+ id: str = Field(..., description="Tag ID")
121
+ value: str | None = Field(default=None, description="Tag value")
122
+
123
+
124
+ class StageInfo(DevRevResponseModel):
125
+ """Stage information for staged objects."""
126
+
127
+ name: str | None = Field(default=None, description="Stage name")
128
+ ordinal: int | None = Field(default=None, description="Stage ordinal position")
129
+
130
+
131
+ class StageUpdate(DevRevBaseModel):
132
+ """Stage update request."""
133
+
134
+ name: str | None = Field(default=None, description="Stage name to set")
135
+
136
+
137
+ class CustomSchemaSpec(DevRevBaseModel):
138
+ """Custom schema specification."""
139
+
140
+ validate_required_fields: bool | None = Field(
141
+ default=None,
142
+ description="Whether to validate required custom fields",
143
+ )
144
+
145
+
146
+ # Common ID patterns for DevRev resources
147
+ # Format: PREFIX-XXXXX (e.g., ACC-12345, ISS-12345, DEVU-12345)
@@ -0,0 +1,103 @@
1
+ """Code Change models for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+
7
+ from pydantic import Field
8
+
9
+ from devrev.models.base import (
10
+ DevRevBaseModel,
11
+ DevRevResponseModel,
12
+ PaginatedResponse,
13
+ UserSummary,
14
+ )
15
+
16
+
17
+ class CodeChange(DevRevResponseModel):
18
+ """DevRev Code Change model."""
19
+
20
+ id: str = Field(..., description="Code change ID")
21
+ display_id: str | None = Field(default=None, description="Display ID")
22
+ title: str | None = Field(default=None, description="Title")
23
+ description: str | None = Field(default=None, description="Description")
24
+ source_url: str | None = Field(default=None, description="Source URL")
25
+ repository: str | None = Field(default=None, description="Repository")
26
+ branch: str | None = Field(default=None, description="Branch")
27
+ created_by: UserSummary | None = Field(default=None, description="Creator")
28
+ created_date: datetime | None = Field(default=None, description="Creation date")
29
+ modified_date: datetime | None = Field(default=None, description="Last modified")
30
+
31
+
32
+ class CodeChangeSummary(DevRevResponseModel):
33
+ """Summary of a Code Change."""
34
+
35
+ id: str = Field(..., description="Code change ID")
36
+ title: str | None = Field(default=None, description="Title")
37
+
38
+
39
+ class CodeChangesCreateRequest(DevRevBaseModel):
40
+ """Request to create a code change."""
41
+
42
+ title: str = Field(..., description="Title")
43
+ description: str | None = Field(default=None, description="Description")
44
+ source_url: str | None = Field(default=None, description="Source URL")
45
+ repository: str | None = Field(default=None, description="Repository")
46
+ branch: str | None = Field(default=None, description="Branch")
47
+
48
+
49
+ class CodeChangesGetRequest(DevRevBaseModel):
50
+ """Request to get a code change by ID."""
51
+
52
+ id: str = Field(..., description="Code change ID")
53
+
54
+
55
+ class CodeChangesDeleteRequest(DevRevBaseModel):
56
+ """Request to delete a code change."""
57
+
58
+ id: str = Field(..., description="Code change ID to delete")
59
+
60
+
61
+ class CodeChangesListRequest(DevRevBaseModel):
62
+ """Request to list code changes."""
63
+
64
+ cursor: str | None = Field(default=None, description="Pagination cursor")
65
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
66
+
67
+
68
+ class CodeChangesUpdateRequest(DevRevBaseModel):
69
+ """Request to update a code change."""
70
+
71
+ id: str = Field(..., description="Code change ID")
72
+ title: str | None = Field(default=None, description="New title")
73
+ description: str | None = Field(default=None, description="New description")
74
+
75
+
76
+ class CodeChangesCreateResponse(DevRevResponseModel):
77
+ """Response from creating a code change."""
78
+
79
+ code_change: CodeChange = Field(..., description="Created code change")
80
+
81
+
82
+ class CodeChangesGetResponse(DevRevResponseModel):
83
+ """Response from getting a code change."""
84
+
85
+ code_change: CodeChange = Field(..., description="Retrieved code change")
86
+
87
+
88
+ class CodeChangesListResponse(PaginatedResponse):
89
+ """Response from listing code changes."""
90
+
91
+ code_changes: list[CodeChange] = Field(..., description="List of code changes")
92
+
93
+
94
+ class CodeChangesUpdateResponse(DevRevResponseModel):
95
+ """Response from updating a code change."""
96
+
97
+ code_change: CodeChange = Field(..., description="Updated code change")
98
+
99
+
100
+ class CodeChangesDeleteResponse(DevRevResponseModel):
101
+ """Response from deleting a code change."""
102
+
103
+ pass
@@ -0,0 +1,115 @@
1
+ """Conversation models for DevRev SDK."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+ from typing import Any
7
+
8
+ from pydantic import Field
9
+
10
+ from devrev.models.base import (
11
+ DevRevBaseModel,
12
+ DevRevResponseModel,
13
+ PaginatedResponse,
14
+ StageInfo,
15
+ UserSummary,
16
+ )
17
+
18
+
19
+ class Conversation(DevRevResponseModel):
20
+ """DevRev Conversation model."""
21
+
22
+ id: str = Field(..., description="Conversation ID")
23
+ display_id: str | None = Field(default=None, description="Display ID")
24
+ title: str | None = Field(default=None, description="Title")
25
+ description: str | None = Field(default=None, description="Description")
26
+ stage: StageInfo | dict[str, Any] | str | None = Field(
27
+ default=None, description="Current stage (string name or structured info)"
28
+ )
29
+ created_by: UserSummary | None = Field(default=None, description="Creator")
30
+ created_date: datetime | None = Field(default=None, description="Creation date")
31
+ modified_date: datetime | None = Field(default=None, description="Last modified")
32
+
33
+
34
+ class ConversationSummary(DevRevResponseModel):
35
+ """Summary of a Conversation."""
36
+
37
+ id: str = Field(..., description="Conversation ID")
38
+ title: str | None = Field(default=None, description="Title")
39
+
40
+
41
+ class ConversationsCreateRequest(DevRevBaseModel):
42
+ """Request to create a conversation."""
43
+
44
+ type: str = Field(default="support", description="Conversation type")
45
+ title: str | None = Field(default=None, description="Title")
46
+ description: str | None = Field(default=None, description="Description")
47
+
48
+
49
+ class ConversationsGetRequest(DevRevBaseModel):
50
+ """Request to get a conversation by ID."""
51
+
52
+ id: str = Field(..., description="Conversation ID")
53
+
54
+
55
+ class ConversationsDeleteRequest(DevRevBaseModel):
56
+ """Request to delete a conversation."""
57
+
58
+ id: str = Field(..., description="Conversation ID to delete")
59
+
60
+
61
+ class ConversationsListRequest(DevRevBaseModel):
62
+ """Request to list conversations."""
63
+
64
+ cursor: str | None = Field(default=None, description="Pagination cursor")
65
+ limit: int | None = Field(default=None, ge=1, le=100, description="Max results")
66
+
67
+
68
+ class ConversationsUpdateRequest(DevRevBaseModel):
69
+ """Request to update a conversation."""
70
+
71
+ id: str = Field(..., description="Conversation ID")
72
+ title: str | None = Field(default=None, description="New title")
73
+ description: str | None = Field(default=None, description="New description")
74
+
75
+
76
+ class ConversationsExportRequest(DevRevBaseModel):
77
+ """Request to export conversations."""
78
+
79
+ cursor: str | None = Field(default=None, description="Pagination cursor")
80
+
81
+
82
+ class ConversationsCreateResponse(DevRevResponseModel):
83
+ """Response from creating a conversation."""
84
+
85
+ conversation: Conversation = Field(..., description="Created conversation")
86
+
87
+
88
+ class ConversationsGetResponse(DevRevResponseModel):
89
+ """Response from getting a conversation."""
90
+
91
+ conversation: Conversation = Field(..., description="Retrieved conversation")
92
+
93
+
94
+ class ConversationsListResponse(PaginatedResponse):
95
+ """Response from listing conversations."""
96
+
97
+ conversations: list[Conversation] = Field(..., description="List of conversations")
98
+
99
+
100
+ class ConversationsUpdateResponse(DevRevResponseModel):
101
+ """Response from updating a conversation."""
102
+
103
+ conversation: Conversation = Field(..., description="Updated conversation")
104
+
105
+
106
+ class ConversationsDeleteResponse(DevRevResponseModel):
107
+ """Response from deleting a conversation."""
108
+
109
+ pass
110
+
111
+
112
+ class ConversationsExportResponse(PaginatedResponse):
113
+ """Response from exporting conversations."""
114
+
115
+ conversations: list[Conversation] = Field(..., description="Exported conversations")