sinatra-dev 0.1.4__tar.gz → 0.1.6__tar.gz

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 (51) hide show
  1. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/PKG-INFO +1 -1
  2. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/pyproject.toml +1 -1
  3. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/tasks/tasks_create.py +20 -16
  4. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/create_task_request.py +22 -0
  5. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/error.py +1 -1
  6. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/task.py +2 -1
  7. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/.gitignore +0 -0
  8. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/LICENSE +0 -0
  9. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/README.md +0 -0
  10. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/__init__.py +0 -0
  11. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_client.py +0 -0
  12. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_errors.py +0 -0
  13. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/__init__.py +0 -0
  14. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/__init__.py +0 -0
  15. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/me/__init__.py +0 -0
  16. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/me/me_get.py +0 -0
  17. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/me/me_revoke_token.py +0 -0
  18. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/messages/__init__.py +0 -0
  19. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/messages/messages_create.py +0 -0
  20. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/messages/messages_list.py +0 -0
  21. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/tasks/__init__.py +0 -0
  22. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/tasks/tasks_get.py +0 -0
  23. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/tasks/tasks_list.py +0 -0
  24. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/tasks/tasks_stop.py +0 -0
  25. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/tickets/__init__.py +0 -0
  26. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/tickets/tickets_delegate.py +0 -0
  27. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/api/tickets/tickets_search.py +0 -0
  28. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/client.py +0 -0
  29. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/errors.py +0 -0
  30. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/__init__.py +0 -0
  31. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/create_message_request.py +0 -0
  32. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/create_message_response.py +0 -0
  33. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/create_task_response.py +0 -0
  34. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/delegate_github_ticket.py +0 -0
  35. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/delegate_linear_ticket.py +0 -0
  36. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/delegate_ticket_response.py +0 -0
  37. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/me.py +0 -0
  38. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/me_user.py +0 -0
  39. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/message.py +0 -0
  40. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/message_list.py +0 -0
  41. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/pull_request.py +0 -0
  42. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/stop_task_response.py +0 -0
  43. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/task_list.py +0 -0
  44. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/ticket.py +0 -0
  45. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/ticket_search_result.py +0 -0
  46. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/ticket_search_result_github.py +0 -0
  47. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/ticket_search_result_linear.py +0 -0
  48. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/models/workspace.py +0 -0
  49. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_generated/types.py +0 -0
  50. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/_retry.py +0 -0
  51. {sinatra_dev-0.1.4 → sinatra_dev-0.1.6}/src/sinatra_dev/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sinatra-dev
3
- Version: 0.1.4
3
+ Version: 0.1.6
4
4
  Summary: Official Python client for sinatra.dev, the AI coding agent that turns Linear and GitHub issues into pull requests: start, follow and stop tasks, and delegate issues.
5
5
  Project-URL: Homepage, https://www.sinatra.dev
6
6
  Project-URL: Documentation, https://docs.sinatra.dev/docs/api-reference
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sinatra-dev"
3
- version = "0.1.4"
3
+ version = "0.1.6"
4
4
  description = "Official Python client for sinatra.dev, the AI coding agent that turns Linear and GitHub issues into pull requests: start, follow and stop tasks, and delegate issues."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -120,7 +120,8 @@ def sync_detailed(
120
120
  any other: it gets a sandbox, can open a pull request, and shows up in the dashboard.
121
121
 
122
122
  Only `prompt` is required. `title` defaults to the prompt's first line, up to 80 characters. `repo`
123
- is optional: omit it to let the agent choose a repository.
123
+ is optional: omit it to let the agent choose a repository. `model` is optional: omit it to use the
124
+ repository's or workspace's model. See [Models](https://docs.sinatra.dev/docs/configuration/models).
124
125
 
125
126
  Before it makes the task, Sinatra checks that the workspace is connected to GitHub when the start
126
127
  names a repository (without GitHub a task that names none can still answer, research or plan), that
@@ -128,9 +129,9 @@ def sync_detailed(
128
129
  a retry with the same key of a start that already made its task is never refused.
129
130
 
130
131
  Send an `Idempotency-Key` so a retry is safe. A start retried with the same key returns the same
131
- task and never starts a second one. The same key with a different prompt, or a different repository
132
- or title if you send them, is `409 idempotency_conflict`. Keys belong to the person who sent them.
133
- The key becomes the first message's `messageId`.
132
+ task and never starts a second one. The same key with a different prompt, or a different repository,
133
+ title or model if you send them, is `409 idempotency_conflict`. Keys belong to the person who sent
134
+ them. The key becomes the first message's `messageId`.
134
135
 
135
136
  If Sinatra saves your request but can't hand it to the agent yet, it answers `503 unavailable` with
136
137
  the new `taskId` and `messageId`. Retry with the same key, or send a message on that task, which
@@ -181,7 +182,8 @@ def sync(
181
182
  any other: it gets a sandbox, can open a pull request, and shows up in the dashboard.
182
183
 
183
184
  Only `prompt` is required. `title` defaults to the prompt's first line, up to 80 characters. `repo`
184
- is optional: omit it to let the agent choose a repository.
185
+ is optional: omit it to let the agent choose a repository. `model` is optional: omit it to use the
186
+ repository's or workspace's model. See [Models](https://docs.sinatra.dev/docs/configuration/models).
185
187
 
186
188
  Before it makes the task, Sinatra checks that the workspace is connected to GitHub when the start
187
189
  names a repository (without GitHub a task that names none can still answer, research or plan), that
@@ -189,9 +191,9 @@ def sync(
189
191
  a retry with the same key of a start that already made its task is never refused.
190
192
 
191
193
  Send an `Idempotency-Key` so a retry is safe. A start retried with the same key returns the same
192
- task and never starts a second one. The same key with a different prompt, or a different repository
193
- or title if you send them, is `409 idempotency_conflict`. Keys belong to the person who sent them.
194
- The key becomes the first message's `messageId`.
194
+ task and never starts a second one. The same key with a different prompt, or a different repository,
195
+ title or model if you send them, is `409 idempotency_conflict`. Keys belong to the person who sent
196
+ them. The key becomes the first message's `messageId`.
195
197
 
196
198
  If Sinatra saves your request but can't hand it to the agent yet, it answers `503 unavailable` with
197
199
  the new `taskId` and `messageId`. Retry with the same key, or send a message on that task, which
@@ -237,7 +239,8 @@ async def asyncio_detailed(
237
239
  any other: it gets a sandbox, can open a pull request, and shows up in the dashboard.
238
240
 
239
241
  Only `prompt` is required. `title` defaults to the prompt's first line, up to 80 characters. `repo`
240
- is optional: omit it to let the agent choose a repository.
242
+ is optional: omit it to let the agent choose a repository. `model` is optional: omit it to use the
243
+ repository's or workspace's model. See [Models](https://docs.sinatra.dev/docs/configuration/models).
241
244
 
242
245
  Before it makes the task, Sinatra checks that the workspace is connected to GitHub when the start
243
246
  names a repository (without GitHub a task that names none can still answer, research or plan), that
@@ -245,9 +248,9 @@ async def asyncio_detailed(
245
248
  a retry with the same key of a start that already made its task is never refused.
246
249
 
247
250
  Send an `Idempotency-Key` so a retry is safe. A start retried with the same key returns the same
248
- task and never starts a second one. The same key with a different prompt, or a different repository
249
- or title if you send them, is `409 idempotency_conflict`. Keys belong to the person who sent them.
250
- The key becomes the first message's `messageId`.
251
+ task and never starts a second one. The same key with a different prompt, or a different repository,
252
+ title or model if you send them, is `409 idempotency_conflict`. Keys belong to the person who sent
253
+ them. The key becomes the first message's `messageId`.
251
254
 
252
255
  If Sinatra saves your request but can't hand it to the agent yet, it answers `503 unavailable` with
253
256
  the new `taskId` and `messageId`. Retry with the same key, or send a message on that task, which
@@ -296,7 +299,8 @@ async def asyncio(
296
299
  any other: it gets a sandbox, can open a pull request, and shows up in the dashboard.
297
300
 
298
301
  Only `prompt` is required. `title` defaults to the prompt's first line, up to 80 characters. `repo`
299
- is optional: omit it to let the agent choose a repository.
302
+ is optional: omit it to let the agent choose a repository. `model` is optional: omit it to use the
303
+ repository's or workspace's model. See [Models](https://docs.sinatra.dev/docs/configuration/models).
300
304
 
301
305
  Before it makes the task, Sinatra checks that the workspace is connected to GitHub when the start
302
306
  names a repository (without GitHub a task that names none can still answer, research or plan), that
@@ -304,9 +308,9 @@ async def asyncio(
304
308
  a retry with the same key of a start that already made its task is never refused.
305
309
 
306
310
  Send an `Idempotency-Key` so a retry is safe. A start retried with the same key returns the same
307
- task and never starts a second one. The same key with a different prompt, or a different repository
308
- or title if you send them, is `409 idempotency_conflict`. Keys belong to the person who sent them.
309
- The key becomes the first message's `messageId`.
311
+ task and never starts a second one. The same key with a different prompt, or a different repository,
312
+ title or model if you send them, is `409 idempotency_conflict`. Keys belong to the person who sent
313
+ them. The key becomes the first message's `messageId`.
310
314
 
311
315
  If Sinatra saves your request but can't hand it to the agent yet, it answers `503 unavailable` with
312
316
  the new `taskId` and `messageId`. Retry with the same key, or send a message on that task, which
@@ -21,11 +21,15 @@ class CreateTaskRequest:
21
21
  80 characters.
22
22
  repo (None | str | Unset): `owner/name` of a repository connected to the workspace. Omit it to let the agent
23
23
  choose.
24
+ model (None | str | Unset): A model from Sinatra's catalog, such as `anthropic/claude-opus-5-5` or `openai-
25
+ codex/gpt-6.1-sol`, that every turn of the task runs on. The model picks its engine. Omit it to use the
26
+ repository's or workspace's model.
24
27
  """
25
28
 
26
29
  prompt: str
27
30
  title: None | str | Unset = UNSET
28
31
  repo: None | str | Unset = UNSET
32
+ model: None | str | Unset = UNSET
29
33
  additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
30
34
 
31
35
  def to_dict(self) -> dict[str, Any]:
@@ -43,6 +47,12 @@ class CreateTaskRequest:
43
47
  else:
44
48
  repo = self.repo
45
49
 
50
+ model: None | str | Unset
51
+ if isinstance(self.model, Unset):
52
+ model = UNSET
53
+ else:
54
+ model = self.model
55
+
46
56
  field_dict: dict[str, Any] = {}
47
57
  field_dict.update(self.additional_properties)
48
58
  field_dict.update(
@@ -54,6 +64,8 @@ class CreateTaskRequest:
54
64
  field_dict["title"] = title
55
65
  if repo is not UNSET:
56
66
  field_dict["repo"] = repo
67
+ if model is not UNSET:
68
+ field_dict["model"] = model
57
69
 
58
70
  return field_dict
59
71
 
@@ -80,10 +92,20 @@ class CreateTaskRequest:
80
92
 
81
93
  repo = _parse_repo(d.pop("repo", UNSET))
82
94
 
95
+ def _parse_model(data: object) -> None | str | Unset:
96
+ if data is None:
97
+ return data
98
+ if isinstance(data, Unset):
99
+ return data
100
+ return cast(None | str | Unset, data)
101
+
102
+ model = _parse_model(d.pop("model", UNSET))
103
+
83
104
  create_task_request = cls(
84
105
  prompt=prompt,
85
106
  title=title,
86
107
  repo=repo,
108
+ model=model,
87
109
  )
88
110
 
89
111
  create_task_request.additional_properties = d
@@ -19,7 +19,7 @@ class Error:
19
19
  error (str): A machine-readable code, such as `invalid_prompt`. Branch on this, not on `reason`. New codes can
20
20
  appear. Known codes: `assigned_to_other`, `bad_request`, `capacity_full`, `github_identity_required`,
21
21
  `github_not_connected`, `github_rate_limited`, `idempotency_conflict`, `internal_error`, `invalid_body`,
22
- `invalid_cursor`, `invalid_idempotency_key`, `invalid_limit`, `invalid_prompt`, `invalid_repo`,
22
+ `invalid_cursor`, `invalid_idempotency_key`, `invalid_limit`, `invalid_model`, `invalid_prompt`, `invalid_repo`,
23
23
  `invalid_status`, `invalid_title`, `invalid_token`, `issue_closed`, `issue_not_found`,
24
24
  `linear_app_user_missing`, `linear_identity_conflict`, `linear_identity_unlinked`, `linear_not_connected`,
25
25
  `linear_reconnect_required`, `not_an_api_task`, `not_an_issue`, `not_found`, `not_running`, `payment_required`,
@@ -26,7 +26,8 @@ class Task:
26
26
  source (str): Where the task started: `api` for the CLI, MCP, this API or the dashboard, `linear` or
27
27
  `github_issue` for an issue, `slack` or `telegram` for a chat. Other sources can appear, so treat an unknown
28
28
  value as a task started elsewhere.
29
- title (None | str): The task's title. `null` for a task whose issue has no title.
29
+ title (None | str): The task's title: its issue's title, or a chat task's name. `null` for a task whose issue
30
+ has no title, or a chat task not yet named.
30
31
  repo (None | str): `owner/name` of the task's repository. `null` until a repository is chosen.
31
32
  pull_request (None | PullRequest): The task's pull request. `null` until one opens.
32
33
  queued (bool): `true` while a turn waits because the workspace is already running as many tasks at a time as its
File without changes
File without changes
File without changes