@tduncan / Cortana / commits / c7ec325

feat: implement chat history screen and update sidebar navigation to prioritize history view

abdulmominsakib committed Apr 5, 2026 at 16:07 UTC c7ec3259b1b402b53145d7be39d1b10ff9ef895f
15 files changed +281 -28826
designs/active_chat/screen.png
Binary files a/designs/active_chat/screen.png and /dev/null differ
designs/chat_empty/screen.png
Binary files a/designs/chat_empty/screen.png and /dev/null differ
designs/monolith_precision/DESIGN.md deleted
-100
@@ -1,100 +0,0 @@
1 -# Design System Documentation: Obsidian Editorial
2 -
3 -## 1. Overview & Creative North Star
4 -**Creative North Star: The Obsidian Architect**
5 -This design system moves beyond the "generic dark mode" template. It is built on the principles of **Obsidian Editorial**: a philosophy that treats digital interfaces as high-end print medium. We are not just building an AI app; we are building a laboratory for the mind.
6 -
7 -The goal is to move away from "contained" UI (boxes inside boxes) and toward "structural" UI. We achieve this through intentional asymmetry, extreme typographic contrast, and a sophisticated layering of dark-neutral tones that mimic the depth of volcanic glass. The experience should feel whispered, not shouted—authoritative, precise, and breathing with immense negative space.
8 -
9 ----
10 -
11 -### 2. Colors & Tonal Depth
12 -The palette is rooted in a monochromatic spectrum, designed to minimize cognitive load while maximizing perceived depth.
13 -
14 -| Token | Hex | Role |
15 -| :--- | :--- | :--- |
16 -| `background` | `#131313` | The base canvas. Dark, but not true black. |
17 -| `primary` | `#FFFFFF` | Actionable items and high-impact text. |
18 -| `on_primary` | `#1A1C1C` | Inverted text for primary buttons. |
19 -| `surface_container_lowest` | `#0E0E0E` | Inset elements, deep wells, or inactive inputs. |
20 -| `surface_container_high` | `#2A2A2A` | Elevated cards or focused modal layers. |
21 -| `outline_variant` | `#474747` | Subtle structural definition (use sparingly). |
22 -
23 -#### The "No-Line" Rule
24 -Standard 1px solid borders are strictly prohibited for sectioning. To define a new area, use a background color shift. For example, a `surface_container_low` side-panel sitting against a `surface` background. The eye should perceive the edge through the change in tone, not a drawn line.
25 -
26 -#### Surface Hierarchy & Nesting
27 -Treat the UI as a series of physical layers.
28 -- **Base Level:** `background`
29 -- **Sectioning:** `surface_container_low`
30 -- **Interactive Elements:** `surface_container_high`
31 -- **Floating Modals:** `surface_bright` with a 24px backdrop blur.
32 -
33 -#### Signature Textures (The Director’s Polish)
34 -While the base is minimalist, use a subtle 1% noise texture or a microscopic tonal gradient (e.g., `primary` to `primary_container` across 120 degrees) on primary CTAs. This prevents the "flat digital" look and adds a "physical" soul to the white elements.
35 -
36 ----
37 -
38 -### 3. Typography
39 -We utilize **Geist Sans** for its Swiss-inspired neutrality and **Geist Mono** for technical/AI data.
40 -
41 -* **Display (Editorial Voice):** Use `display-lg` (3.5rem) with `-0.04em` letter spacing for hero headers. This creates a tight, "locked-in" editorial feel.
42 -* **Body (The Workhorse):** `body-md` (0.875rem) is the default for AI-generated responses. It provides high legibility without overcrowding the screen.
43 -* **Labels (The Technical Layer):** Use `label-sm` (0.6875rem) in **Geist Mono** for metadata (tokens, server latency, model IDs). All labels should be Uppercase with `0.05em` tracking to distinguish them from content.
44 -
45 ----
46 -
47 -### 4. Elevation & Depth
48 -In this design system, height is an illusion created by light, not lines.
49 -
50 -* **The Layering Principle:** Depth is achieved by "stacking." A `surface_container_lowest` card placed inside a `surface_container_high` section creates a natural "carved out" effect.
51 -* **Ambient Shadows:** For floating elements (menus/modals), use a "Whisper Shadow."
52 - * *Shadow:* `0px 10px 40px rgba(0, 0, 0, 0.4)`
53 - * The shadow color must be a tinted version of the background, never pure black.
54 -* **The "Ghost Border" Fallback:** If a border is required for accessibility, use the `outline_variant` token at **15% opacity**. It should be felt, not seen.
55 -* **Glassmorphism:** Use `surface_bright` at 60% opacity with a `20px` backdrop blur for floating navigation bars to allow the underlying AI "stream" of text to bleed through.
56 -
57 ----
58 -
59 -### 5. Components
60 -
61 -#### Buttons
62 -- **Primary:** `primary` background, `on_primary` text. No border. Corners: `6px`.
63 -- **Secondary:** `surface_container_highest` background. Corners: `6px`.
64 -- **Ghost:** No background. `primary` text. Hover state shifts background to `surface_container_low`.
65 -
66 -#### Input Fields
67 -Forbid the "boxed" input. Use a "Platform" style: A `surface_container_lowest` background with a subtle 1px bottom-stroke using `outline_variant`. On focus, the bottom stroke becomes `primary`.
68 -
69 -#### Cards & Lists
70 -Cards must never have dividers. Separate list items using `spacing-4` (1rem) of vertical white space. To group items, wrap them in a `surface_container_low` container with a `md` (0.75rem) corner radius.
71 -
72 -#### AI Command Bar (The "Core" Component)
73 -This is a floating bar using `surface_container_highest`.
74 -- **Radius:** `full` (9999px).
75 -- **Style:** Glassmorphism (blur: 16px).
76 -- **Leading Icon:** Lucide `Sparkles` in `primary`.
77 -
78 ----
79 -
80 -### 6. Do’s and Don’ts
81 -
82 -#### Do
83 -- **Embrace Asymmetry:** Align headings to the far left and metadata to the far right to create a wide, expansive feel.
84 -- **Use Mono for Values:** Any number or technical ID must be in **Geist Mono**.
85 -- **Generous Whitespace:** If you think there is enough space, add 20% more. This system thrives on "the void."
86 -
87 -#### Don’t
88 -- **Don't use #000000:** It kills the "Obsidian" depth. Stick to the `#0E0E0E` to `#131313` range.
89 -- **Don't use Dividers:** If you need a divider, use a `1px` height `surface_container_low` block that only spans 80% of the container width.
90 -- **Don't use Rounded-None:** Always keep corners between `6dp` and `12dp` (except for the Command Bar) to soften the brutalist typography.
91 -- **Don't use colorful Icons:** Keep all Lucide icons in `on_surface_variant` (#C6C6C6) or `primary`.
92 -
93 ----
94 -
95 -### 7. Spacing Scale Reference
96 -Use these tokens to maintain the editorial rhythm:
97 -- **Tight (2):** 0.5rem (Icon/Text spacing)
98 -- **Standard (4):** 1rem (Internal padding)
99 -- **Section (8):** 2rem (Between content blocks)
100 -- **Breathing (12):** 3rem (Margin from screen edges)
\ No newline at end of file
designs/onboarding_step_1/screen.png
Binary files a/designs/onboarding_step_1/screen.png and /dev/null differ
designs/persona_creation/screen.png
Binary files a/designs/persona_creation/screen.png and /dev/null differ
designs/server_management/screen.png
Binary files a/designs/server_management/screen.png and /dev/null differ
designs/settings/screen.png
Binary files a/designs/settings/screen.png and /dev/null differ
docs/openapi.json deleted
-28602
@@ -1,28602 +0,0 @@
1 -{
2 - "openapi": "3.1.0",
3 - "info": {
4 - "title": "OpenRouter API",
5 - "version": "1.0.0",
6 - "description": "OpenAI-compatible API with additional OpenRouter features",
7 - "contact": {
8 - "name": "OpenRouter Support",
9 - "url": "https://openrouter.ai/docs",
10 - "email": "support@openrouter.ai"
11 - },
12 - "license": {
13 - "name": "MIT",
14 - "url": "https://opensource.org/licenses/MIT"
15 - }
16 - },
17 - "servers": [
18 - {
19 - "url": "https://openrouter.ai/api/v1",
20 - "description": "Production server",
21 - "x-speakeasy-server-id": "production"
22 - }
23 - ],
24 - "security": [
25 - {
26 - "apiKey": []
27 - }
28 - ],
29 - "externalDocs": {
30 - "description": "OpenRouter Documentation",
31 - "url": "https://openrouter.ai/docs"
32 - },
33 - "components": {
34 - "schemas": {
35 - "OpenAIResponsesResponseStatus": {
36 - "type": "string",
37 - "enum": [
38 - "completed",
39 - "incomplete",
40 - "in_progress",
41 - "failed",
42 - "cancelled",
43 - "queued"
44 - ],
45 - "x-speakeasy-unknown-values": "allow"
46 - },
47 - "FileCitation": {
48 - "type": "object",
49 - "properties": {
50 - "type": {
51 - "type": "string",
52 - "enum": [
53 - "file_citation"
54 - ]
55 - },
56 - "file_id": {
57 - "type": "string"
58 - },
59 - "filename": {
60 - "type": "string"
61 - },
62 - "index": {
63 - "type": "number"
64 - }
65 - },
66 - "required": [
67 - "type",
68 - "file_id",
69 - "filename",
70 - "index"
71 - ],
72 - "example": {
73 - "type": "file_citation",
74 - "file_id": "file-abc123",
75 - "filename": "research_paper.pdf",
76 - "index": 0
77 - }
78 - },
79 - "URLCitation": {
80 - "type": "object",
81 - "properties": {
82 - "type": {
83 - "type": "string",
84 - "enum": [
85 - "url_citation"
86 - ]
87 - },
88 - "url": {
89 - "type": "string"
90 - },
91 - "title": {
92 - "type": "string"
93 - },
94 - "start_index": {
95 - "type": "number"
96 - },
97 - "end_index": {
98 - "type": "number"
99 - }
100 - },
101 - "required": [
102 - "type",
103 - "url",
104 - "title",
105 - "start_index",
106 - "end_index"
107 - ],
108 - "example": {
109 - "type": "url_citation",
110 - "start_index": 0,
111 - "end_index": 42,
112 - "title": "OpenRouter Documentation",
113 - "url": "https://openrouter.ai/docs"
114 - }
115 - },
116 - "FilePath": {
117 - "type": "object",
118 - "properties": {
119 - "type": {
120 - "type": "string",
121 - "enum": [
122 - "file_path"
123 - ]
124 - },
125 - "file_id": {
126 - "type": "string"
127 - },
128 - "index": {
129 - "type": "number"
130 - }
131 - },
132 - "required": [
133 - "type",
134 - "file_id",
135 - "index"
136 - ],
137 - "example": {
138 - "type": "file_path",
139 - "file_id": "file-xyz789",
140 - "index": 0
141 - }
142 - },
143 - "OpenAIResponsesAnnotation": {
144 - "anyOf": [
145 - {
146 - "$ref": "#/components/schemas/FileCitation"
147 - },
148 - {
149 - "$ref": "#/components/schemas/URLCitation"
150 - },
151 - {
152 - "$ref": "#/components/schemas/FilePath"
153 - }
154 - ]
155 - },
156 - "ResponseOutputText": {
157 - "type": "object",
158 - "properties": {
159 - "type": {
160 - "type": "string",
161 - "enum": [
162 - "output_text"
163 - ]
164 - },
165 - "text": {
166 - "type": "string"
167 - },
168 - "annotations": {
169 - "type": "array",
170 - "items": {
171 - "$ref": "#/components/schemas/OpenAIResponsesAnnotation"
172 - }
173 - },
174 - "logprobs": {
175 - "type": "array",
176 - "items": {
177 - "type": "object",
178 - "properties": {
179 - "token": {
180 - "type": "string"
181 - },
182 - "bytes": {
183 - "type": "array",
184 - "items": {
185 - "type": "number"
186 - }
187 - },
188 - "logprob": {
189 - "type": "number"
190 - },
191 - "top_logprobs": {
192 - "type": "array",
193 - "items": {
194 - "type": "object",
195 - "properties": {
196 - "token": {
197 - "type": "string"
198 - },
199 - "bytes": {
200 - "type": "array",
201 - "items": {
202 - "type": "number"
203 - }
204 - },
205 - "logprob": {
206 - "type": "number"
207 - }
208 - },
209 - "required": [
210 - "token",
211 - "bytes",
212 - "logprob"
213 - ]
214 - }
215 - }
216 - },
217 - "required": [
218 - "token",
219 - "bytes",
220 - "logprob",
221 - "top_logprobs"
222 - ]
223 - }
224 - }
225 - },
226 - "required": [
227 - "type",
228 - "text"
229 - ],
230 - "example": {
231 - "type": "output_text",
232 - "text": "The capital of France is Paris.",
233 - "annotations": [
234 - {
235 - "type": "url_citation",
236 - "start_index": 0,
237 - "end_index": 42,
238 - "title": "Paris - Wikipedia",
239 - "url": "https://en.wikipedia.org/wiki/Paris"
240 - }
241 - ]
242 - }
243 - },
244 - "OpenAIResponsesRefusalContent": {
245 - "type": "object",
246 - "properties": {
247 - "type": {
248 - "type": "string",
249 - "enum": [
250 - "refusal"
251 - ]
252 - },
253 - "refusal": {
254 - "type": "string"
255 - }
256 - },
257 - "required": [
258 - "type",
259 - "refusal"
260 - ],
261 - "example": {
262 - "type": "refusal",
263 - "refusal": "I'm sorry, I cannot assist with that request"
264 - }
265 - },
266 - "OutputMessage": {
267 - "type": "object",
268 - "properties": {
269 - "id": {
270 - "type": "string"
271 - },
272 - "role": {
273 - "type": "string",
274 - "enum": [
275 - "assistant"
276 - ]
277 - },
278 - "type": {
279 - "type": "string",
280 - "enum": [
281 - "message"
282 - ]
283 - },
284 - "status": {
285 - "anyOf": [
286 - {
287 - "type": "string",
288 - "enum": [
289 - "completed"
290 - ]
291 - },
292 - {
293 - "type": "string",
294 - "enum": [
295 - "incomplete"
296 - ]
297 - },
298 - {
299 - "type": "string",
300 - "enum": [
301 - "in_progress"
302 - ]
303 - }
304 - ]
305 - },
306 - "content": {
307 - "type": "array",
308 - "items": {
309 - "anyOf": [
310 - {
311 - "$ref": "#/components/schemas/ResponseOutputText"
312 - },
313 - {
314 - "$ref": "#/components/schemas/OpenAIResponsesRefusalContent"
315 - }
316 - ]
317 - }
318 - },
319 - "phase": {
320 - "anyOf": [
321 - {
322 - "type": "string",
323 - "enum": [
324 - "commentary"
325 - ]
326 - },
327 - {
328 - "type": "string",
329 - "enum": [
330 - "final_answer"
331 - ]
332 - },
333 - {
334 - "nullable": true
335 - }
336 - ],
337 - "description": "The phase of an assistant message. Use `commentary` for an intermediate assistant message and `final_answer` for the final assistant message. For follow-up requests with models like `gpt-5.3-codex` and later, preserve and resend phase on all assistant messages. Omitting it can degrade performance. Not used for user messages."
338 - }
339 - },
340 - "required": [
341 - "id",
342 - "role",
343 - "type",
344 - "content"
345 - ],
346 - "example": {
347 - "id": "msg-abc123",
348 - "role": "assistant",
349 - "type": "message",
350 - "status": "completed",
351 - "content": [
352 - {
353 - "type": "output_text",
354 - "text": "Hello! How can I help you today?"
355 - }
356 - ]
357 - }
358 - },
359 - "OutputMessageItem": {
360 - "allOf": [
361 - {
362 - "$ref": "#/components/schemas/OutputMessage"
363 - },
364 - {
365 - "type": "object",
366 - "properties": {}
367 - }
368 - ],
369 - "example": {
370 - "id": "msg-123",
371 - "type": "message",
372 - "role": "assistant",
373 - "status": "completed",
374 - "content": [
375 - {
376 - "type": "output_text",
377 - "text": "Hello! How can I help you?",
378 - "annotations": []
379 - }
380 - ]
381 - },
382 - "description": "An output message item"
383 - },
384 - "ReasoningTextContent": {
385 - "type": "object",
386 - "properties": {
387 - "type": {
388 - "type": "string",
389 - "enum": [
390 - "reasoning_text"
391 - ]
392 - },
393 - "text": {
394 - "type": "string"
395 - }
396 - },
397 - "required": [
398 - "type",
399 - "text"
400 - ],
401 - "example": {
402 - "type": "reasoning_text",
403 - "text": "Let me think step by step about this problem..."
404 - }
405 - },
406 - "ReasoningSummaryText": {
407 - "type": "object",
408 - "properties": {
409 - "type": {
410 - "type": "string",
411 - "enum": [
412 - "summary_text"
413 - ]
414 - },
415 - "text": {
416 - "type": "string"
417 - }
418 - },
419 - "required": [
420 - "type",
421 - "text"
422 - ],
423 - "example": {
424 - "type": "summary_text",
425 - "text": "Analyzed the problem using first principles"
426 - }
427 - },
428 - "OutputItemReasoning": {
429 - "type": "object",
430 - "properties": {
431 - "type": {
432 - "type": "string",
433 - "enum": [
434 - "reasoning"
435 - ]
436 - },
437 - "id": {
438 - "type": "string"
439 - },
440 - "content": {
441 - "type": "array",
442 - "items": {
443 - "$ref": "#/components/schemas/ReasoningTextContent"
444 - }
445 - },
446 - "summary": {
447 - "type": "array",
448 - "items": {
449 - "$ref": "#/components/schemas/ReasoningSummaryText"
450 - }
451 - },
452 - "encrypted_content": {
453 - "type": "string",
454 - "nullable": true
455 - },
456 - "status": {
457 - "anyOf": [
458 - {
459 - "type": "string",
460 - "enum": [
461 - "completed"
462 - ]
463 - },
464 - {
465 - "type": "string",
466 - "enum": [
467 - "incomplete"
468 - ]
469 - },
470 - {
471 - "type": "string",
472 - "enum": [
473 - "in_progress"
474 - ]
475 - }
476 - ]
477 - }
478 - },
479 - "required": [
480 - "type",
481 - "id",
482 - "summary"
483 - ],
484 - "example": {
485 - "type": "reasoning",
486 - "id": "reasoning-abc123",
487 - "summary": [
488 - {
489 - "type": "summary_text",
490 - "text": "Analyzed the problem using first principles"
491 - }
492 - ]
493 - }
494 - },
495 - "OutputReasoningItem": {
496 - "allOf": [
497 - {
498 - "$ref": "#/components/schemas/OutputItemReasoning"
499 - },
500 - {
501 - "type": "object",
502 - "properties": {
503 - "content": {
504 - "type": "array",
505 - "nullable": true,
506 - "items": {
507 - "$ref": "#/components/schemas/ReasoningTextContent"
508 - }
509 - },
510 - "signature": {
511 - "type": "string",
512 - "nullable": true,
513 - "description": "A signature for the reasoning content, used for verification",
514 - "example": "EvcBCkgIChABGAIqQKkSDbRuVEQUk9qN1odC098l9SEj..."
515 - },
516 - "format": {
517 - "type": "string",
518 - "nullable": true,
519 - "enum": [
520 - "unknown",
521 - "openai-responses-v1",
522 - "azure-openai-responses-v1",
523 - "xai-responses-v1",
524 - "anthropic-claude-v1",
525 - "google-gemini-v1"
526 - ],
527 - "description": "The format of the reasoning content",
528 - "example": "anthropic-claude-v1",
529 - "x-speakeasy-unknown-values": "allow"
530 - }
531 - }
532 - }
533 - ],
534 - "example": {
535 - "id": "reasoning-123",
536 - "type": "reasoning",
537 - "status": "completed",
538 - "summary": [
539 - {
540 - "type": "summary_text",
541 - "text": "Analyzed the problem and found the optimal solution."
542 - }
543 - ],
544 - "content": [
545 - {
546 - "type": "reasoning_text",
547 - "text": "First, we analyze the problem..."
548 - }
549 - ],
550 - "signature": "EvcBCkgIChABGAIqQKkSDbRuVEQUk9qN1odC098l9SEj...",
551 - "format": "anthropic-claude-v1"
552 - },
553 - "description": "An output item containing reasoning"
554 - },
555 - "OutputItemFunctionCall": {
556 - "type": "object",
557 - "properties": {
558 - "type": {
559 - "type": "string",
560 - "enum": [
561 - "function_call"
562 - ]
563 - },
564 - "id": {
565 - "type": "string"
566 - },
567 - "name": {
568 - "type": "string"
569 - },
570 - "arguments": {
571 - "type": "string"
572 - },
573 - "call_id": {
574 - "type": "string"
575 - },
576 - "status": {
577 - "anyOf": [
578 - {
579 - "type": "string",
580 - "enum": [
581 - "completed"
582 - ]
583 - },
584 - {
585 - "type": "string",
586 - "enum": [
587 - "incomplete"
588 - ]
589 - },
590 - {
591 - "type": "string",
592 - "enum": [
593 - "in_progress"
594 - ]
595 - }
596 - ]
597 - }
598 - },
599 - "required": [
600 - "type",
601 - "name",
602 - "arguments",
603 - "call_id"
604 - ],
605 - "example": {
606 - "type": "function_call",
607 - "id": "call-abc123",
608 - "name": "get_weather",
609 - "arguments": "{\"location\":\"San Francisco\",\"unit\":\"celsius\"}",
610 - "call_id": "call-abc123"
611 - }
612 - },
613 - "OutputFunctionCallItem": {
614 - "allOf": [
615 - {
616 - "$ref": "#/components/schemas/OutputItemFunctionCall"
617 - },
618 - {
619 - "type": "object",
620 - "properties": {}
621 - }
622 - ],
623 - "example": {
624 - "type": "function_call",
625 - "id": "call-abc123",
626 - "name": "get_weather",
627 - "arguments": "{\"location\":\"San Francisco\",\"unit\":\"celsius\"}",
628 - "call_id": "call-abc123"
629 - }
630 - },
631 - "WebSearchStatus": {
632 - "type": "string",
633 - "enum": [
634 - "completed",
635 - "searching",
636 - "in_progress",
637 - "failed"
638 - ],
639 - "example": "completed",
640 - "x-speakeasy-unknown-values": "allow"
641 - },
642 - "OutputItemWebSearchCall": {
643 - "type": "object",
644 - "properties": {
645 - "type": {
646 - "type": "string",
647 - "enum": [
648 - "web_search_call"
649 - ]
650 - },
651 - "id": {
652 - "type": "string"
653 - },
654 - "action": {
655 - "oneOf": [
656 - {
657 - "type": "object",
658 - "properties": {
659 - "type": {
660 - "type": "string",
661 - "enum": [
662 - "search"
663 - ]
664 - },
665 - "query": {
666 - "type": "string"
667 - },
668 - "queries": {
669 - "type": "array",
670 - "items": {
671 - "type": "string"
672 - }
673 - },
674 - "sources": {
675 - "type": "array",
676 - "items": {
677 - "type": "object",
678 - "properties": {
679 - "type": {
680 - "type": "string",
681 - "enum": [
682 - "url"
683 - ]
684 - },
685 - "url": {
686 - "type": "string"
687 - }
688 - },
689 - "required": [
690 - "type",
691 - "url"
692 - ]
693 - }
694 - }
695 - },
696 - "required": [
697 - "type",
698 - "query"
699 - ]
700 - },
701 - {
702 - "type": "object",
703 - "properties": {
704 - "type": {
705 - "type": "string",
706 - "enum": [
707 - "open_page"
708 - ]
709 - },
710 - "url": {
711 - "type": "string",
712 - "nullable": true
713 - }
714 - },
715 - "required": [
716 - "type"
717 - ]
718 - },
719 - {
720 - "type": "object",
721 - "properties": {
722 - "type": {
723 - "type": "string",
724 - "enum": [
725 - "find_in_page"
726 - ]
727 - },
728 - "pattern": {
729 - "type": "string"
730 - },
731 - "url": {
732 - "type": "string"
733 - }
734 - },
735 - "required": [
736 - "type",
737 - "pattern",
738 - "url"
739 - ]
740 - }
741 - ]
742 - },
743 - "status": {
744 - "$ref": "#/components/schemas/WebSearchStatus"
745 - }
746 - },
747 - "required": [
748 - "type",
749 - "id",
750 - "action",
751 - "status"
752 - ],
753 - "example": {
754 - "type": "web_search_call",
755 - "id": "search-abc123",
756 - "action": {
757 - "type": "search",
758 - "query": "OpenAI API"
759 - },
760 - "status": "completed"
761 - }
762 - },
763 - "OutputWebSearchCallItem": {
764 - "allOf": [
765 - {
766 - "$ref": "#/components/schemas/OutputItemWebSearchCall"
767 - },
768 - {
769 - "type": "object",
770 - "properties": {}
771 - }
772 - ],
773 - "example": {
774 - "type": "web_search_call",
775 - "id": "search-abc123",
776 - "action": {
777 - "type": "search",
778 - "query": "OpenAI API"
779 - },
780 - "status": "completed"
781 - }
782 - },
783 - "OutputItemFileSearchCall": {
784 - "type": "object",
785 - "properties": {
786 - "type": {
787 - "type": "string",
788 - "enum": [
789 - "file_search_call"
790 - ]
791 - },
792 - "id": {
793 - "type": "string"
794 - },
795 - "queries": {
796 - "type": "array",
797 - "items": {
798 - "type": "string"
799 - }
800 - },
801 - "status": {
802 - "$ref": "#/components/schemas/WebSearchStatus"
803 - }
804 - },
805 - "required": [
806 - "type",
807 - "id",
808 - "queries",
809 - "status"
810 - ],
811 - "example": {
812 - "type": "file_search_call",
813 - "id": "filesearch-abc123",
814 - "queries": [
815 - "machine learning algorithms",
816 - "neural networks"
817 - ],
818 - "status": "completed"
819 - }
820 - },
821 - "OutputFileSearchCallItem": {
822 - "allOf": [
823 - {
824 - "$ref": "#/components/schemas/OutputItemFileSearchCall"
825 - },
826 - {
827 - "type": "object",
828 - "properties": {}
829 - }
830 - ],
831 - "example": {
832 - "type": "file_search_call",
833 - "id": "filesearch-abc123",
834 - "queries": [
835 - "machine learning algorithms",
836 - "neural networks"
837 - ],
838 - "status": "completed"
839 - }
840 - },
841 - "ImageGenerationStatus": {
842 - "type": "string",
843 - "enum": [
844 - "in_progress",
845 - "completed",
846 - "generating",
847 - "failed"
848 - ],
849 - "example": "completed",
850 - "x-speakeasy-unknown-values": "allow"
851 - },
852 - "OutputItemImageGenerationCall": {
853 - "type": "object",
854 - "properties": {
855 - "type": {
856 - "type": "string",
857 - "enum": [
858 - "image_generation_call"
859 - ]
860 - },
861 - "id": {
862 - "type": "string"
863 - },
864 - "result": {
865 - "type": "string",
866 - "nullable": true,
867 - "default": null
868 - },
869 - "status": {
870 - "$ref": "#/components/schemas/ImageGenerationStatus"
871 - }
872 - },
873 - "required": [
874 - "type",
875 - "id",
876 - "status"
877 - ],
878 - "example": {
879 - "type": "image_generation_call",
880 - "id": "imagegen-abc123",
881 - "result": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==",
882 - "status": "completed"
883 - }
884 - },
885 - "OutputImageGenerationCallItem": {
886 - "allOf": [
887 - {
888 - "$ref": "#/components/schemas/OutputItemImageGenerationCall"
889 - },
890 - {
891 - "type": "object",
892 - "properties": {}
893 - }
894 - ],
895 - "example": {
896 - "type": "image_generation_call",
897 - "id": "imagegen-abc123",
898 - "result": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==",
899 - "status": "completed"
900 - }
901 - },
902 - "OutputServerToolItem": {
903 - "type": "object",
904 - "properties": {
905 - "type": {
906 - "type": "string",
907 - "pattern": "^openrouter:",
908 - "description": "Server tool type (e.g. openrouter:datetime, openrouter:web_search)"
909 - },
910 - "id": {
911 - "type": "string"
912 - },
913 - "status": {
914 - "type": "string",
915 - "enum": [
916 - "completed",
917 - "in_progress",
918 - "incomplete"
919 - ],
920 - "x-speakeasy-unknown-values": "allow"
921 - }
922 - },
923 - "required": [
924 - "type",
925 - "status"
926 - ],
927 - "additionalProperties": {
928 - "nullable": true
929 - },
930 - "description": "A generic OpenRouter server tool output item",
931 - "example": {
932 - "type": "openrouter:web_search",
933 - "id": "ws_tmp_abc123",
934 - "status": "completed"
935 - }
936 - },
937 - "OutputItems": {
938 - "anyOf": [
939 - {
940 - "$ref": "#/components/schemas/OutputMessageItem"
941 - },
942 - {
943 - "$ref": "#/components/schemas/OutputReasoningItem"
944 - },
945 - {
946 - "$ref": "#/components/schemas/OutputFunctionCallItem"
947 - },
948 - {
949 - "$ref": "#/components/schemas/OutputWebSearchCallItem"
950 - },
951 - {
952 - "$ref": "#/components/schemas/OutputFileSearchCallItem"
953 - },
954 - {
955 - "$ref": "#/components/schemas/OutputImageGenerationCallItem"
956 - },
957 - {
958 - "$ref": "#/components/schemas/OutputServerToolItem"
959 - }
960 - ],
961 - "description": "An output item from the response",
962 - "example": {
963 - "id": "msg-abc123",
964 - "role": "assistant",
965 - "type": "message",
966 - "status": "completed",
967 - "content": [
968 - {
969 - "type": "output_text",
970 - "text": "Hello! How can I help you today?"
971 - }
972 - ]
973 - }
974 - },
975 - "ResponsesErrorField": {
976 - "type": "object",
977 - "nullable": true,
978 - "properties": {
979 - "code": {
980 - "type": "string",
981 - "enum": [
982 - "server_error",
983 - "rate_limit_exceeded",
984 - "invalid_prompt",
985 - "vector_store_timeout",
986 - "invalid_image",
987 - "invalid_image_format",
988 - "invalid_base64_image",
989 - "invalid_image_url",
990 - "image_too_large",
991 - "image_too_small",
992 - "image_parse_error",
993 - "image_content_policy_violation",
994 - "invalid_image_mode",
995 - "image_file_too_large",
996 - "unsupported_image_media_type",
997 - "empty_image_file",
998 - "failed_to_download_image",
999 - "image_file_not_found"
1000 - ],
1001 - "x-speakeasy-unknown-values": "allow"
1002 - },
1003 - "message": {
1004 - "type": "string"
1005 - }
1006 - },
1007 - "required": [
1008 - "code",
1009 - "message"
1010 - ],
1011 - "description": "Error information returned from the API",
1012 - "example": {
1013 - "code": "rate_limit_exceeded",
1014 - "message": "Rate limit exceeded. Please try again later."
1015 - }
1016 - },
1017 - "IncompleteDetails": {
1018 - "type": "object",
1019 - "nullable": true,
1020 - "properties": {
1021 - "reason": {
1022 - "type": "string",
1023 - "enum": [
1024 - "max_output_tokens",
1025 - "content_filter"
1026 - ],
1027 - "x-speakeasy-unknown-values": "allow"
1028 - }
1029 - }
1030 - },
1031 - "OpenAIResponsesUsage": {
1032 - "type": "object",
1033 - "properties": {
1034 - "input_tokens": {
1035 - "type": "number"
1036 - },
1037 - "input_tokens_details": {
1038 - "type": "object",
1039 - "properties": {
1040 - "cached_tokens": {
1041 - "type": "number"
1042 - }
1043 - },
1044 - "required": [
1045 - "cached_tokens"
1046 - ]
1047 - },
1048 - "output_tokens": {
1049 - "type": "number"
1050 - },
1051 - "output_tokens_details": {
1052 - "type": "object",
1053 - "properties": {
1054 - "reasoning_tokens": {
1055 - "type": "number"
1056 - }
1057 - },
1058 - "required": [
1059 - "reasoning_tokens"
1060 - ]
1061 - },
1062 - "total_tokens": {
1063 - "type": "number"
1064 - }
1065 - },
1066 - "required": [
1067 - "input_tokens",
1068 - "input_tokens_details",
1069 - "output_tokens",
1070 - "output_tokens_details",
1071 - "total_tokens"
1072 - ]
1073 - },
1074 - "Usage": {
1075 - "allOf": [
1076 - {
1077 - "$ref": "#/components/schemas/OpenAIResponsesUsage"
1078 - },
1079 - {
1080 - "type": "object",
1081 - "nullable": true,
1082 - "properties": {
1083 - "cost": {
1084 - "type": "number",
1085 - "nullable": true,
1086 - "description": "Cost of the completion"
1087 - },
1088 - "is_byok": {
1089 - "type": "boolean",
1090 - "description": "Whether a request was made using a Bring Your Own Key configuration"
1091 - },
1092 - "cost_details": {
1093 - "type": "object",
1094 - "properties": {
1095 - "upstream_inference_cost": {
1096 - "type": "number",
1097 - "format": "double"
1098 - },
1099 - "upstream_inference_input_cost": {
1100 - "type": "number",
1101 - "format": "double"
1102 - },
1103 - "upstream_inference_output_cost": {
1104 - "type": "number",
1105 - "format": "double"
1106 - }
1107 - },
1108 - "required": [
1109 - "upstream_inference_input_cost",
1110 - "upstream_inference_output_cost"
1111 - ]
1112 - }
1113 - }
1114 - }
1115 - ],
1116 - "description": "Token usage information for the response",
1117 - "example": {
1118 - "input_tokens": 10,
1119 - "output_tokens": 25,
1120 - "total_tokens": 35,
1121 - "input_tokens_details": {
1122 - "cached_tokens": 0
1123 - },
1124 - "output_tokens_details": {
1125 - "reasoning_tokens": 0
1126 - },
1127 - "cost": 0.0012,
1128 - "cost_details": {
1129 - "upstream_inference_cost": null,
1130 - "upstream_inference_input_cost": 0.0008,
1131 - "upstream_inference_output_cost": 0.0004
1132 - }
1133 - }
1134 - },
1135 - "InputText": {
1136 - "type": "object",
1137 - "properties": {
1138 - "type": {
1139 - "type": "string",
1140 - "enum": [
1141 - "input_text"
1142 - ]
1143 - },
1144 - "text": {
1145 - "type": "string"
1146 - }
1147 - },
1148 - "required": [
1149 - "type",
1150 - "text"
1151 - ],
1152 - "description": "Text input content item",
1153 - "example": {
1154 - "type": "input_text",
1155 - "text": "Hello, how can I help you?"
1156 - }
1157 - },
1158 - "InputImage": {
1159 - "type": "object",
1160 - "properties": {
1161 - "type": {
1162 - "type": "string",
1163 - "enum": [
1164 - "input_image"
1165 - ]
1166 - },
1167 - "detail": {
1168 - "type": "string",
1169 - "enum": [
1170 - "auto",
1171 - "high",
1172 - "low"
1173 - ],
1174 - "x-speakeasy-unknown-values": "allow"
1175 - },
1176 - "image_url": {
1177 - "type": "string",
1178 - "nullable": true
1179 - }
1180 - },
1181 - "required": [
1182 - "type",
1183 - "detail"
1184 - ],
1185 - "description": "Image input content item",
1186 - "example": {
1187 - "type": "input_image",
1188 - "detail": "auto",
1189 - "image_url": "https://example.com/image.jpg"
1190 - }
1191 - },
1192 - "InputFile": {
1193 - "type": "object",
1194 - "properties": {
1195 - "type": {
1196 - "type": "string",
1197 - "enum": [
1198 - "input_file"
1199 - ]
1200 - },
1201 - "file_id": {
1202 - "type": "string",
1203 - "nullable": true
1204 - },
1205 - "file_data": {
1206 - "type": "string"
1207 - },
1208 - "filename": {
1209 - "type": "string"
1210 - },
1211 - "file_url": {
1212 - "type": "string"
1213 - }
1214 - },
1215 - "required": [
1216 - "type"
1217 - ],
1218 - "description": "File input content item",
1219 - "example": {
1220 - "type": "input_file",
1221 - "file_id": "file-abc123",
1222 - "filename": "document.pdf"
1223 - }
1224 - },
1225 - "InputAudio": {
1226 - "type": "object",
1227 - "properties": {
1228 - "type": {
1229 - "type": "string",
1230 - "enum": [
1231 - "input_audio"
1232 - ]
1233 - },
1234 - "input_audio": {
1235 - "type": "object",
1236 - "properties": {
1237 - "data": {
1238 - "type": "string"
1239 - },
1240 - "format": {
1241 - "type": "string",
1242 - "enum": [
1243 - "mp3",
1244 - "wav"
1245 - ],
1246 - "x-speakeasy-unknown-values": "allow"
1247 - }
1248 - },
1249 - "required": [
1250 - "data",
1251 - "format"
1252 - ]
1253 - }
1254 - },
1255 - "required": [
1256 - "type",
1257 - "input_audio"
1258 - ],
1259 - "description": "Audio input content item",
1260 - "example": {
1261 - "type": "input_audio",
1262 - "input_audio": {
1263 - "data": "SGVsbG8gV29ybGQ=",
1264 - "format": "mp3"
1265 - }
1266 - }
1267 - },
1268 - "ToolCallStatusEnum": {
1269 - "type": "string",
1270 - "nullable": true,
1271 - "enum": [
1272 - "in_progress",
1273 - "completed",
1274 - "incomplete"
1275 - ],
1276 - "example": "completed",
1277 - "x-speakeasy-unknown-values": "allow"
1278 - },
1279 - "BaseInputs": {
1280 - "anyOf": [
1281 - {
1282 - "type": "string"
1283 - },
1284 - {
1285 - "type": "array",
1286 - "items": {
1287 - "anyOf": [
1288 - {
1289 - "type": "object",
1290 - "properties": {
1291 - "type": {
1292 - "type": "string",
1293 - "enum": [
1294 - "message"
1295 - ]
1296 - },
1297 - "role": {
1298 - "anyOf": [
1299 - {
1300 - "type": "string",
1301 - "enum": [
1302 - "user"
1303 - ]
1304 - },
1305 - {
1306 - "type": "string",
1307 - "enum": [
1308 - "system"
1309 - ]
1310 - },
1311 - {
1312 - "type": "string",
1313 - "enum": [
1314 - "assistant"
1315 - ]
1316 - },
1317 - {
1318 - "type": "string",
1319 - "enum": [
1320 - "developer"
1321 - ]
1322 - }
1323 - ]
1324 - },
1325 - "content": {
1326 - "anyOf": [
1327 - {
1328 - "type": "array",
1329 - "items": {
1330 - "oneOf": [
1331 - {
1332 - "$ref": "#/components/schemas/InputText"
1333 - },
1334 - {
1335 - "$ref": "#/components/schemas/InputImage"
1336 - },
1337 - {
1338 - "$ref": "#/components/schemas/InputFile"
1339 - },
1340 - {
1341 - "$ref": "#/components/schemas/InputAudio"
1342 - }
1343 - ],
1344 - "discriminator": {
1345 - "propertyName": "type",
1346 - "mapping": {
1347 - "input_text": "#/components/schemas/InputText",
1348 - "input_image": "#/components/schemas/InputImage",
1349 - "input_file": "#/components/schemas/InputFile",
1350 - "input_audio": "#/components/schemas/InputAudio"
1351 - }
1352 - }
1353 - }
1354 - },
1355 - {
1356 - "type": "string"
1357 - }
1358 - ]
1359 - },
1360 - "phase": {
1361 - "anyOf": [
1362 - {
1363 - "type": "string",
1364 - "enum": [
1365 - "commentary"
1366 - ]
1367 - },
1368 - {
1369 - "type": "string",
1370 - "enum": [
1371 - "final_answer"
1372 - ]
1373 - },
1374 - {
1375 - "nullable": true
1376 - }
1377 - ]
1378 - }
1379 - },
1380 - "required": [
1381 - "role",
1382 - "content"
1383 - ]
1384 - },
1385 - {
1386 - "type": "object",
1387 - "properties": {
1388 - "id": {
1389 - "type": "string"
1390 - },
1391 - "type": {
1392 - "type": "string",
1393 - "enum": [
1394 - "message"
1395 - ]
1396 - },
1397 - "role": {
1398 - "anyOf": [
1399 - {
1400 - "type": "string",
1401 - "enum": [
1402 - "user"
1403 - ]
1404 - },
1405 - {
1406 - "type": "string",
1407 - "enum": [
1408 - "system"
1409 - ]
1410 - },
1411 - {
1412 - "type": "string",
1413 - "enum": [
1414 - "developer"
1415 - ]
1416 - }
1417 - ]
1418 - },
1419 - "content": {
1420 - "type": "array",
1421 - "items": {
1422 - "oneOf": [
1423 - {
1424 - "$ref": "#/components/schemas/InputText"
1425 - },
1426 - {
1427 - "$ref": "#/components/schemas/InputImage"
1428 - },
1429 - {
1430 - "$ref": "#/components/schemas/InputFile"
1431 - },
1432 - {
1433 - "$ref": "#/components/schemas/InputAudio"
1434 - }
1435 - ],
1436 - "discriminator": {
1437 - "propertyName": "type",
1438 - "mapping": {
1439 - "input_text": "#/components/schemas/InputText",
1440 - "input_image": "#/components/schemas/InputImage",
1441 - "input_file": "#/components/schemas/InputFile",
1442 - "input_audio": "#/components/schemas/InputAudio"
1443 - }
1444 - }
1445 - }
1446 - }
1447 - },
1448 - "required": [
1449 - "id",
1450 - "role",
1451 - "content"
1452 - ]
1453 - },
1454 - {
1455 - "type": "object",
1456 - "properties": {
1457 - "type": {
1458 - "type": "string",
1459 - "enum": [
1460 - "function_call_output"
1461 - ]
1462 - },
1463 - "id": {
1464 - "type": "string",
1465 - "nullable": true
1466 - },
1467 - "call_id": {
1468 - "type": "string"
1469 - },
1470 - "output": {
1471 - "anyOf": [
1472 - {
1473 - "type": "string"
1474 - },
1475 - {
1476 - "type": "array",
1477 - "items": {
1478 - "oneOf": [
1479 - {
1480 - "$ref": "#/components/schemas/InputText"
1481 - },
1482 - {
1483 - "$ref": "#/components/schemas/InputImage"
1484 - },
1485 - {
1486 - "$ref": "#/components/schemas/InputFile"
1487 - }
1488 - ],
1489 - "discriminator": {
1490 - "propertyName": "type",
1491 - "mapping": {
1492 - "input_text": "#/components/schemas/InputText",
1493 - "input_image": "#/components/schemas/InputImage",
1494 - "input_file": "#/components/schemas/InputFile"
1495 - }
1496 - }
1497 - }
1498 - }
1499 - ]
1500 - },
1501 - "status": {
1502 - "$ref": "#/components/schemas/ToolCallStatusEnum"
1503 - }
1504 - },
1505 - "required": [
1506 - "type",
1507 - "call_id",
1508 - "output"
1509 - ]
1510 - },
1511 - {
1512 - "type": "object",
1513 - "properties": {
1514 - "type": {
1515 - "type": "string",
1516 - "enum": [
1517 - "function_call"
1518 - ]
1519 - },
1520 - "call_id": {
1521 - "type": "string"
1522 - },
1523 - "name": {
1524 - "type": "string"
1525 - },
1526 - "arguments": {
1527 - "type": "string"
1528 - },
1529 - "id": {
1530 - "type": "string"
1531 - },
1532 - "status": {
1533 - "$ref": "#/components/schemas/ToolCallStatusEnum"
1534 - }
1535 - },
1536 - "required": [
1537 - "type",
1538 - "call_id",
1539 - "name",
1540 - "arguments"
1541 - ]
1542 - },
1543 - {
1544 - "$ref": "#/components/schemas/OutputItemImageGenerationCall"
1545 - },
1546 - {
1547 - "$ref": "#/components/schemas/OutputMessage"
1548 - }
1549 - ]
1550 - }
1551 - },
1552 - {
1553 - "nullable": true
1554 - }
1555 - ]
1556 - },
1557 - "RequestMetadata": {
1558 - "type": "object",
1559 - "nullable": true,
1560 - "additionalProperties": {
1561 - "type": "string",
1562 - "maxLength": 512
1563 - },
1564 - "description": "Metadata key-value pairs for the request. Keys must be ≤64 characters and cannot contain brackets. Values must be ≤512 characters. Maximum 16 pairs allowed.",
1565 - "example": {
1566 - "user_id": "123",
1567 - "session_id": "abc-def-ghi"
1568 - }
1569 - },
1570 - "FunctionTool": {
1571 - "type": "object",
1572 - "properties": {
1573 - "type": {
1574 - "type": "string",
1575 - "enum": [
1576 - "function"
1577 - ]
1578 - },
1579 - "name": {
1580 - "type": "string"
1581 - },
1582 - "description": {
1583 - "type": "string",
1584 - "nullable": true
1585 - },
1586 - "strict": {
1587 - "type": "boolean",
1588 - "nullable": true
1589 - },
1590 - "parameters": {
1591 - "type": "object",
1592 - "nullable": true,
1593 - "additionalProperties": {
1594 - "nullable": true
1595 - }
1596 - }
1597 - },
1598 - "required": [
1599 - "type",
1600 - "name",
1601 - "parameters"
1602 - ],
1603 - "description": "Function tool definition",
1604 - "example": {
1605 - "type": "function",
1606 - "name": "get_weather",
1607 - "description": "Get the current weather in a location",
1608 - "parameters": {
1609 - "type": "object",
1610 - "properties": {
1611 - "location": {
1612 - "type": "string",
1613 - "description": "The city and state"
1614 - },
1615 - "unit": {
1616 - "type": "string",
1617 - "enum": [
1618 - "celsius",
1619 - "fahrenheit"
1620 - ],
1621 - "x-speakeasy-unknown-values": "allow"
1622 - }
1623 - },
1624 - "required": [
1625 - "location"
1626 - ]
1627 - }
1628 - }
1629 - },
1630 - "SearchContextSizeEnum": {
1631 - "type": "string",
1632 - "enum": [
1633 - "low",
1634 - "medium",
1635 - "high"
1636 - ],
1637 - "description": "Size of the search context for web search tools",
1638 - "example": "medium",
1639 - "x-speakeasy-unknown-values": "allow"
1640 - },
1641 - "Preview_WebSearchUserLocation": {
1642 - "type": "object",
1643 - "nullable": true,
1644 - "properties": {
1645 - "type": {
1646 - "type": "string",
1647 - "enum": [
1648 - "approximate"
1649 - ]
1650 - },
1651 - "city": {
1652 - "type": "string",
1653 - "nullable": true
1654 - },
1655 - "country": {
1656 - "type": "string",
1657 - "nullable": true
1658 - },
1659 - "region": {
1660 - "type": "string",
1661 - "nullable": true
1662 - },
1663 - "timezone": {
1664 - "type": "string",
1665 - "nullable": true
1666 - }
1667 - },
1668 - "required": [
1669 - "type"
1670 - ]
1671 - },
1672 - "Preview_WebSearchServerTool": {
1673 - "type": "object",
1674 - "properties": {
1675 - "type": {
1676 - "type": "string",
1677 - "enum": [
1678 - "web_search_preview"
1679 - ]
1680 - },
1681 - "search_context_size": {
1682 - "$ref": "#/components/schemas/SearchContextSizeEnum"
1683 - },
1684 - "user_location": {
1685 - "$ref": "#/components/schemas/Preview_WebSearchUserLocation"
1686 - },
1687 - "engine": {
1688 - "type": "string",
1689 - "enum": [
1690 - "auto",
1691 - "native",
1692 - "exa",
1693 - "firecrawl",
1694 - "parallel"
1695 - ],
1696 - "description": "Which search engine to use. \"auto\" (default) uses native if the provider supports it, otherwise Exa. \"native\" forces the provider's built-in search. \"exa\" forces the Exa search API. \"firecrawl\" uses Firecrawl (requires BYOK). \"parallel\" uses the Parallel search API.",
1697 - "example": "auto",
1698 - "x-speakeasy-unknown-values": "allow"
1699 - },
1700 - "max_results": {
1701 - "type": "number",
1702 - "minimum": 1,
1703 - "maximum": 25,
1704 - "description": "Maximum number of search results to return per search call. Defaults to 5. Applies to Exa, Firecrawl, and Parallel engines; ignored with native provider search.",
1705 - "example": 5
1706 - },
1707 - "filters": {
1708 - "type": "object",
1709 - "nullable": true,
1710 - "properties": {
1711 - "allowed_domains": {
1712 - "type": "array",
1713 - "nullable": true,
1714 - "items": {
1715 - "type": "string"
1716 - }
1717 - },
1718 - "excluded_domains": {
1719 - "type": "array",
1720 - "nullable": true,
1721 - "items": {
1722 - "type": "string"
1723 - }
1724 - }
1725 - }
1726 - }
1727 - },
1728 - "required": [
1729 - "type"
1730 - ],
1731 - "description": "Web search preview tool configuration",
1732 - "example": {
1733 - "type": "web_search_preview"
1734 - }
1735 - },
1736 - "Preview_20250311_WebSearchServerTool": {
1737 - "type": "object",
1738 - "properties": {
1739 - "type": {
1740 - "type": "string",
1741 - "enum": [
1742 - "web_search_preview_2025_03_11"
1743 - ]
1744 - },
1745 - "search_context_size": {
1746 - "$ref": "#/components/schemas/SearchContextSizeEnum"
1747 - },
1748 - "user_location": {
1749 - "$ref": "#/components/schemas/Preview_WebSearchUserLocation"
1750 - },
1751 - "engine": {
1752 - "type": "string",
1753 - "enum": [
1754 - "auto",
1755 - "native",
1756 - "exa",
1757 - "firecrawl",
1758 - "parallel"
1759 - ],
1760 - "description": "Which search engine to use. \"auto\" (default) uses native if the provider supports it, otherwise Exa. \"native\" forces the provider's built-in search. \"exa\" forces the Exa search API. \"firecrawl\" uses Firecrawl (requires BYOK). \"parallel\" uses the Parallel search API.",
1761 - "example": "auto",
1762 - "x-speakeasy-unknown-values": "allow"
1763 - },
1764 - "max_results": {
1765 - "type": "number",
1766 - "minimum": 1,
1767 - "maximum": 25,
1768 - "description": "Maximum number of search results to return per search call. Defaults to 5. Applies to Exa, Firecrawl, and Parallel engines; ignored with native provider search.",
1769 - "example": 5
1770 - },
1771 - "filters": {
1772 - "type": "object",
1773 - "nullable": true,
1774 - "properties": {
1775 - "allowed_domains": {
1776 - "type": "array",
1777 - "nullable": true,
1778 - "items": {
1779 - "type": "string"
1780 - }
1781 - },
1782 - "excluded_domains": {
1783 - "type": "array",
1784 - "nullable": true,
1785 - "items": {
1786 - "type": "string"
1787 - }
1788 - }
1789 - }
1790 - }
1791 - },
1792 - "required": [
1793 - "type"
1794 - ],
1795 - "description": "Web search preview tool configuration (2025-03-11 version)",
1796 - "example": {
1797 - "type": "web_search_preview_2025_03_11"
1798 - }
1799 - },
1800 - "WebSearchUserLocation": {
1801 - "type": "object",
1802 - "nullable": true,
1803 - "properties": {
1804 - "type": {
1805 - "type": "string",
1806 - "enum": [
1807 - "approximate"
1808 - ]
1809 - },
1810 - "city": {
1811 - "type": "string",
1812 - "nullable": true
1813 - },
1814 - "country": {
1815 - "type": "string",
1816 - "nullable": true
1817 - },
1818 - "region": {
1819 - "type": "string",
1820 - "nullable": true
1821 - },
1822 - "timezone": {
1823 - "type": "string",
1824 - "nullable": true
1825 - }
1826 - },
1827 - "description": "User location information for web search",
1828 - "example": {
1829 - "type": "approximate",
1830 - "city": "San Francisco",
1831 - "country": "USA",
1832 - "region": "California",
1833 - "timezone": "America/Los_Angeles"
1834 - }
1835 - },
1836 - "Legacy_WebSearchServerTool": {
1837 - "type": "object",
1838 - "properties": {
1839 - "type": {
1840 - "type": "string",
1841 - "enum": [
1842 - "web_search"
1843 - ]
1844 - },
1845 - "filters": {
1846 - "type": "object",
1847 - "nullable": true,
1848 - "properties": {
1849 - "allowed_domains": {
1850 - "type": "array",
1851 - "nullable": true,
1852 - "items": {
1853 - "type": "string"
1854 - }
1855 - },
1856 - "excluded_domains": {
1857 - "type": "array",
1858 - "nullable": true,
1859 - "items": {
1860 - "type": "string"
1861 - }
1862 - }
1863 - }
1864 - },
1865 - "search_context_size": {
1866 - "$ref": "#/components/schemas/SearchContextSizeEnum"
1867 - },
1868 - "user_location": {
1869 - "$ref": "#/components/schemas/WebSearchUserLocation"
1870 - },
1871 - "engine": {
1872 - "type": "string",
1873 - "enum": [
1874 - "auto",
1875 - "native",
1876 - "exa",
1877 - "firecrawl",
1878 - "parallel"
1879 - ],
1880 - "description": "Which search engine to use. \"auto\" (default) uses native if the provider supports it, otherwise Exa. \"native\" forces the provider's built-in search. \"exa\" forces the Exa search API. \"firecrawl\" uses Firecrawl (requires BYOK). \"parallel\" uses the Parallel search API.",
1881 - "example": "auto",
1882 - "x-speakeasy-unknown-values": "allow"
1883 - },
1884 - "max_results": {
1885 - "type": "number",
1886 - "minimum": 1,
1887 - "maximum": 25,
1888 - "description": "Maximum number of search results to return per search call. Defaults to 5. Applies to Exa, Firecrawl, and Parallel engines; ignored with native provider search.",
1889 - "example": 5
1890 - }
1891 - },
1892 - "required": [
1893 - "type"
1894 - ],
1895 - "description": "Web search tool configuration",
1896 - "example": {
1897 - "type": "web_search",
1898 - "engine": "auto",
1899 - "filters": {
1900 - "allowed_domains": [
1901 - "example.com"
1902 - ]
1903 - }
1904 - }
1905 - },
1906 - "WebSearchServerTool": {
1907 - "type": "object",
1908 - "properties": {
1909 - "type": {
1910 - "type": "string",
1911 - "enum": [
1912 - "web_search_2025_08_26"
1913 - ]
1914 - },
1915 - "filters": {
1916 - "type": "object",
1917 - "nullable": true,
1918 - "properties": {
1919 - "allowed_domains": {
1920 - "type": "array",
1921 - "nullable": true,
1922 - "items": {
1923 - "type": "string"
1924 - }
1925 - },
1926 - "excluded_domains": {
1927 - "type": "array",
1928 - "nullable": true,
1929 - "items": {
1930 - "type": "string"
1931 - }
1932 - }
1933 - }
1934 - },
1935 - "search_context_size": {
1936 - "$ref": "#/components/schemas/SearchContextSizeEnum"
1937 - },
1938 - "user_location": {
1939 - "$ref": "#/components/schemas/WebSearchUserLocation"
1940 - },
1941 - "engine": {
1942 - "type": "string",
1943 - "enum": [
1944 - "auto",
1945 - "native",
1946 - "exa",
1947 - "firecrawl",
1948 - "parallel"
1949 - ],
1950 - "description": "Which search engine to use. \"auto\" (default) uses native if the provider supports it, otherwise Exa. \"native\" forces the provider's built-in search. \"exa\" forces the Exa search API. \"firecrawl\" uses Firecrawl (requires BYOK). \"parallel\" uses the Parallel search API.",
1951 - "example": "auto",
1952 - "x-speakeasy-unknown-values": "allow"
1953 - },
1954 - "max_results": {
1955 - "type": "number",
1956 - "minimum": 1,
1957 - "maximum": 25,
1958 - "description": "Maximum number of search results to return per search call. Defaults to 5. Applies to Exa, Firecrawl, and Parallel engines; ignored with native provider search.",
1959 - "example": 5
1960 - }
1961 - },
1962 - "required": [
1963 - "type"
1964 - ],
1965 - "description": "Web search tool configuration (2025-08-26 version)",
1966 - "example": {
1967 - "type": "web_search_2025_08_26",
1968 - "engine": "auto",
1969 - "filters": {
1970 - "allowed_domains": [
1971 - "example.com"
1972 - ]
1973 - }
1974 - }
1975 - },
1976 - "CompoundFilter": {
1977 - "type": "object",
1978 - "properties": {
1979 - "type": {
1980 - "type": "string",
1981 - "enum": [
1982 - "and",
1983 - "or"
1984 - ],
1985 - "x-speakeasy-unknown-values": "allow"
1986 - },
1987 - "filters": {
1988 - "type": "array",
1989 - "items": {
1990 - "type": "object",
1991 - "additionalProperties": {
1992 - "nullable": true
1993 - }
1994 - }
1995 - }
1996 - },
1997 - "required": [
1998 - "type",
1999 - "filters"
2000 - ],
2001 - "description": "A compound filter that combines multiple comparison or compound filters"
2002 - },
2003 - "FileSearchServerTool": {
2004 - "type": "object",
2005 - "properties": {
2006 - "type": {
2007 - "type": "string",
2008 - "enum": [
2009 - "file_search"
2010 - ]
2011 - },
2012 - "vector_store_ids": {
2013 - "type": "array",
2014 - "items": {
2015 - "type": "string"
2016 - }
2017 - },
2018 - "filters": {
2019 - "anyOf": [
2020 - {
2021 - "type": "object",
2022 - "properties": {
2023 - "key": {
2024 - "type": "string"
2025 - },
2026 - "type": {
2027 - "type": "string",
2028 - "enum": [
2029 - "eq",
2030 - "ne",
2031 - "gt",
2032 - "gte",
2033 - "lt",
2034 - "lte"
2035 - ],
2036 - "x-speakeasy-unknown-values": "allow"
2037 - },
2038 - "value": {
2039 - "anyOf": [
2040 - {
2041 - "type": "string"
2042 - },
2043 - {
2044 - "type": "number",
2045 - "format": "double"
2046 - },
2047 - {
2048 - "type": "boolean"
2049 - },
2050 - {
2051 - "type": "array",
2052 - "items": {
2053 - "anyOf": [
2054 - {
2055 - "type": "string"
2056 - },
2057 - {
2058 - "type": "number",
2059 - "format": "double"
2060 - }
2061 - ]
2062 - }
2063 - }
2064 - ]
2065 - }
2066 - },
2067 - "required": [
2068 - "key",
2069 - "type",
2070 - "value"
2071 - ]
2072 - },
2073 - {
2074 - "$ref": "#/components/schemas/CompoundFilter"
2075 - },
2076 - {
2077 - "nullable": true
2078 - }
2079 - ]
2080 - },
2081 - "max_num_results": {
2082 - "type": "integer"
2083 - },
2084 - "ranking_options": {
2085 - "type": "object",
2086 - "properties": {
2087 - "ranker": {
2088 - "type": "string",
2089 - "enum": [
2090 - "auto",
2091 - "default-2024-11-15"
2092 - ],
2093 - "x-speakeasy-unknown-values": "allow"
2094 - },
2095 - "score_threshold": {
2096 - "type": "number",
2097 - "format": "double"
2098 - }
2099 - }
2100 - }
2101 - },
2102 - "required": [
2103 - "type",
2104 - "vector_store_ids"
2105 - ],
2106 - "description": "File search tool configuration",
2107 - "example": {
2108 - "type": "file_search",
2109 - "vector_store_ids": [
2110 - "vs_abc123"
2111 - ]
2112 - }
2113 - },
2114 - "ComputerUseServerTool": {
2115 - "type": "object",
2116 - "properties": {
2117 - "type": {
2118 - "type": "string",
2119 - "enum": [
2120 - "computer_use_preview"
2121 - ]
2122 - },
2123 - "display_height": {
2124 - "type": "integer"
2125 - },
2126 - "display_width": {
2127 - "type": "integer"
2128 - },
2129 - "environment": {
2130 - "type": "string",
2131 - "enum": [
2132 - "windows",
2133 - "mac",
2134 - "linux",
2135 - "ubuntu",
2136 - "browser"
2137 - ],
2138 - "x-speakeasy-unknown-values": "allow"
2139 - }
2140 - },
2141 - "required": [
2142 - "type",
2143 - "display_height",
2144 - "display_width",
2145 - "environment"
2146 - ],
2147 - "description": "Computer use preview tool configuration",
2148 - "example": {
2149 - "type": "computer_use_preview",
2150 - "display_height": 768,
2151 - "display_width": 1024,
2152 - "environment": "linux"
2153 - }
2154 - },
2155 - "CodeInterpreterServerTool": {
2156 - "type": "object",
2157 - "properties": {
2158 - "type": {
2159 - "type": "string",
2160 - "enum": [
2161 - "code_interpreter"
2162 - ]
2163 - },
2164 - "container": {
2165 - "anyOf": [
2166 - {
2167 - "type": "string"
2168 - },
2169 - {
2170 - "type": "object",
2171 - "properties": {
2172 - "type": {
2173 - "type": "string",
2174 - "enum": [
2175 - "auto"
2176 - ]
2177 - },
2178 - "file_ids": {
2179 - "type": "array",
2180 - "items": {
2181 - "type": "string"
2182 - }
2183 - },
2184 - "memory_limit": {
2185 - "type": "string",
2186 - "nullable": true,
2187 - "enum": [
2188 - "1g",
2189 - "4g",
2190 - "16g",
2191 - "64g"
2192 - ],
2193 - "x-speakeasy-unknown-values": "allow"
2194 - }
2195 - },
2196 - "required": [
2197 - "type"
2198 - ]
2199 - }
2200 - ]
2201 - }
2202 - },
2203 - "required": [
2204 - "type",
2205 - "container"
2206 - ],
2207 - "description": "Code interpreter tool configuration",
2208 - "example": {
2209 - "type": "code_interpreter",
2210 - "container": "auto"
2211 - }
2212 - },
2213 - "McpServerTool": {
2214 - "type": "object",
2215 - "properties": {
2216 - "type": {
2217 - "type": "string",
2218 - "enum": [
2219 - "mcp"
2220 - ]
2221 - },
2222 - "server_label": {
2223 - "type": "string"
2224 - },
2225 - "allowed_tools": {
2226 - "anyOf": [
2227 - {
2228 - "type": "array",
2229 - "items": {
2230 - "type": "string"
2231 - }
2232 - },
2233 - {
2234 - "type": "object",
2235 - "properties": {
2236 - "tool_names": {
2237 - "type": "array",
2238 - "items": {
2239 - "type": "string"
2240 - }
2241 - },
2242 - "read_only": {
2243 - "type": "boolean"
2244 - }
2245 - }
2246 - },
2247 - {
2248 - "nullable": true
2249 - },
2250 - {
2251 - "nullable": true
2252 - }
2253 - ]
2254 - },
2255 - "authorization": {
2256 - "type": "string"
2257 - },
2258 - "connector_id": {
2259 - "type": "string",
2260 - "enum": [
2261 - "connector_dropbox",
2262 - "connector_gmail",
2263 - "connector_googlecalendar",
2264 - "connector_googledrive",
2265 - "connector_microsoftteams",
2266 - "connector_outlookcalendar",
2267 - "connector_outlookemail",
2268 - "connector_sharepoint"
2269 - ],
2270 - "x-speakeasy-unknown-values": "allow"
2271 - },
2272 - "headers": {
2273 - "type": "object",
2274 - "nullable": true,
2275 - "additionalProperties": {
2276 - "type": "string"
2277 - }
2278 - },
2279 - "require_approval": {
2280 - "anyOf": [
2281 - {
2282 - "type": "object",
2283 - "properties": {
2284 - "never": {
2285 - "type": "object",
2286 - "properties": {
2287 - "tool_names": {
2288 - "type": "array",
2289 - "items": {
2290 - "type": "string"
2291 - }
2292 - }
2293 - }
2294 - },
2295 - "always": {
2296 - "type": "object",
2297 - "properties": {
2298 - "tool_names": {
2299 - "type": "array",
2300 - "items": {
2301 - "type": "string"
2302 - }
2303 - }
2304 - }
2305 - }
2306 - }
2307 - },
2308 - {
2309 - "type": "string",
2310 - "enum": [
2311 - "always"
2312 - ]
2313 - },
2314 - {
2315 - "type": "string",
2316 - "enum": [
2317 - "never"
2318 - ]
2319 - },
2320 - {
2321 - "nullable": true
2322 - },
2323 - {
2324 - "nullable": true
2325 - }
2326 - ]
2327 - },
2328 - "server_description": {
2329 - "type": "string"
2330 - },
2331 - "server_url": {
2332 - "type": "string"
2333 - }
2334 - },
2335 - "required": [
2336 - "type",
2337 - "server_label"
2338 - ],
2339 - "description": "MCP (Model Context Protocol) tool configuration",
2340 - "example": {
2341 - "type": "mcp",
2342 - "server_label": "my-server",
2343 - "server_url": "https://example.com/mcp"
2344 - }
2345 - },
2346 - "ImageGenerationServerTool": {
2347 - "type": "object",
2348 - "properties": {
2349 - "type": {
2350 - "type": "string",
2351 - "enum": [
2352 - "image_generation"
2353 - ]
2354 - },
2355 - "background": {
2356 - "type": "string",
2357 - "enum": [
2358 - "transparent",
2359 - "opaque",
2360 - "auto"
2361 - ],
2362 - "x-speakeasy-unknown-values": "allow"
2363 - },
2364 - "input_fidelity": {
2365 - "type": "string",
2366 - "nullable": true,
2367 - "enum": [
2368 - "high",
2369 - "low"
2370 - ],
2371 - "x-speakeasy-unknown-values": "allow"
2372 - },
2373 - "input_image_mask": {
2374 - "type": "object",
2375 - "properties": {
2376 - "image_url": {
2377 - "type": "string"
2378 - },
2379 - "file_id": {
2380 - "type": "string"
2381 - }
2382 - }
2383 - },
2384 - "model": {
2385 - "type": "string",
2386 - "enum": [
2387 - "gpt-image-1",
2388 - "gpt-image-1-mini"
2389 - ],
2390 - "x-speakeasy-unknown-values": "allow"
2391 - },
2392 - "moderation": {
2393 - "type": "string",
2394 - "enum": [
2395 - "auto",
2396 - "low"
2397 - ],
2398 - "x-speakeasy-unknown-values": "allow"
2399 - },
2400 - "output_compression": {
2401 - "type": "integer"
2402 - },
2403 - "output_format": {
2404 - "type": "string",
2405 - "enum": [
2406 - "png",
2407 - "webp",
2408 - "jpeg"
2409 - ],
2410 - "x-speakeasy-unknown-values": "allow"
2411 - },
2412 - "partial_images": {
2413 - "type": "integer"
2414 - },
2415 - "quality": {
2416 - "type": "string",
2417 - "enum": [
2418 - "low",
2419 - "medium",
2420 - "high",
2421 - "auto"
2422 - ],
2423 - "x-speakeasy-unknown-values": "allow"
2424 - },
2425 - "size": {
2426 - "type": "string",
2427 - "enum": [
2428 - "1024x1024",
2429 - "1024x1536",
2430 - "1536x1024",
2431 - "auto"
2432 - ],
2433 - "x-speakeasy-unknown-values": "allow"
2434 - }
2435 - },
2436 - "required": [
2437 - "type"
2438 - ],
2439 - "description": "Image generation tool configuration",
2440 - "example": {
2441 - "type": "image_generation",
2442 - "quality": "high"
2443 - }
2444 - },
2445 - "CodexLocalShellTool": {
2446 - "type": "object",
2447 - "properties": {
2448 - "type": {
2449 - "type": "string",
2450 - "enum": [
2451 - "local_shell"
2452 - ]
2453 - }
2454 - },
2455 - "required": [
2456 - "type"
2457 - ],
2458 - "description": "Local shell tool configuration",
2459 - "example": {
2460 - "type": "local_shell"
2461 - }
2462 - },
2463 - "ShellServerTool": {
2464 - "type": "object",
2465 - "properties": {
2466 - "type": {
2467 - "type": "string",
2468 - "enum": [
2469 - "shell"
2470 - ]
2471 - }
2472 - },
2473 - "required": [
2474 - "type"
2475 - ],
2476 - "description": "Shell tool configuration",
2477 - "example": {
2478 - "type": "shell"
2479 - }
2480 - },
2481 - "ApplyPatchServerTool": {
2482 - "type": "object",
2483 - "properties": {
2484 - "type": {
2485 - "type": "string",
2486 - "enum": [
2487 - "apply_patch"
2488 - ]
2489 - }
2490 - },
2491 - "required": [
2492 - "type"
2493 - ],
2494 - "description": "Apply patch tool configuration",
2495 - "example": {
2496 - "type": "apply_patch"
2497 - }
2498 - },
2499 - "CustomTool": {
2500 - "type": "object",
2501 - "properties": {
2502 - "type": {
2503 - "type": "string",
2504 - "enum": [
2505 - "custom"
2506 - ]
2507 - },
2508 - "name": {
2509 - "type": "string"
2510 - },
2511 - "description": {
2512 - "type": "string"
2513 - },
2514 - "format": {
2515 - "anyOf": [
2516 - {
2517 - "type": "object",
2518 - "properties": {
2519 - "type": {
2520 - "type": "string",
2521 - "enum": [
2522 - "text"
2523 - ]
2524 - }
2525 - },
2526 - "required": [
2527 - "type"
2528 - ]
2529 - },
2530 - {
2531 - "type": "object",
2532 - "properties": {
2533 - "type": {
2534 - "type": "string",
2535 - "enum": [
2536 - "grammar"
2537 - ]
2538 - },
2539 - "definition": {
2540 - "type": "string"
2541 - },
2542 - "syntax": {
2543 - "type": "string",
2544 - "enum": [
2545 - "lark",
2546 - "regex"
2547 - ],
2548 - "x-speakeasy-unknown-values": "allow"
2549 - }
2550 - },
2551 - "required": [
2552 - "type",
2553 - "definition",
2554 - "syntax"
2555 - ]
2556 - }
2557 - ]
2558 - }
2559 - },
2560 - "required": [
2561 - "type",
2562 - "name"
2563 - ],
2564 - "description": "Custom tool configuration",
2565 - "example": {
2566 - "type": "custom",
2567 - "name": "my_tool"
2568 - }
2569 - },
2570 - "ToolChoiceAllowed": {
2571 - "type": "object",
2572 - "properties": {
2573 - "type": {
2574 - "type": "string",
2575 - "enum": [
2576 - "allowed_tools"
2577 - ]
2578 - },
2579 - "mode": {
2580 - "anyOf": [
2581 - {
2582 - "type": "string",
2583 - "enum": [
2584 - "auto"
2585 - ]
2586 - },
2587 - {
2588 - "type": "string",
2589 - "enum": [
2590 - "required"
2591 - ]
2592 - }
2593 - ]
2594 - },
2595 - "tools": {
2596 - "type": "array",
2597 - "items": {
2598 - "type": "object",
2599 - "additionalProperties": {
2600 - "nullable": true
2601 - }
2602 - }
2603 - }
2604 - },
2605 - "required": [
2606 - "type",
2607 - "mode",
2608 - "tools"
2609 - ],
2610 - "description": "Constrains the model to a pre-defined set of allowed tools",
2611 - "example": {
2612 - "type": "allowed_tools",
2613 - "mode": "auto",
2614 - "tools": [
2615 - {
2616 - "type": "function",
2617 - "name": "get_weather"
2618 - }
2619 - ]
2620 - }
2621 - },
2622 - "OpenAIResponsesToolChoice": {
2623 - "anyOf": [
2624 - {
2625 - "type": "string",
2626 - "enum": [
2627 - "auto"
2628 - ]
2629 - },
2630 - {
2631 - "type": "string",
2632 - "enum": [
2633 - "none"
2634 - ]
2635 - },
2636 - {
2637 - "type": "string",
2638 - "enum": [
2639 - "required"
2640 - ]
2641 - },
2642 - {
2643 - "type": "object",
2644 - "properties": {
2645 - "type": {
2646 - "type": "string",
2647 - "enum": [
2648 - "function"
2649 - ]
2650 - },
2651 - "name": {
2652 - "type": "string"
2653 - }
2654 - },
2655 - "required": [
2656 - "type",
2657 - "name"
2658 - ]
2659 - },
2660 - {
2661 - "type": "object",
2662 - "properties": {
2663 - "type": {
2664 - "anyOf": [
2665 - {
2666 - "type": "string",
2667 - "enum": [
2668 - "web_search_preview_2025_03_11"
2669 - ]
2670 - },
2671 - {
2672 - "type": "string",
2673 - "enum": [
2674 - "web_search_preview"
2675 - ]
2676 - }
2677 - ]
2678 - }
2679 - },
2680 - "required": [
2681 - "type"
2682 - ]
2683 - },
2684 - {
2685 - "$ref": "#/components/schemas/ToolChoiceAllowed"
2686 - }
2687 - ]
2688 - },
2689 - "StoredPromptTemplate": {
2690 - "type": "object",
2691 - "nullable": true,
2692 - "properties": {
2693 - "id": {
2694 - "type": "string"
2695 - },
2696 - "variables": {
2697 - "type": "object",
2698 - "nullable": true,
2699 - "additionalProperties": {
2700 - "anyOf": [
2701 - {
2702 - "type": "string"
2703 - },
2704 - {
2705 - "$ref": "#/components/schemas/InputText"
2706 - },
2707 - {
2708 - "$ref": "#/components/schemas/InputImage"
2709 - },
2710 - {
2711 - "$ref": "#/components/schemas/InputFile"
2712 - }
2713 - ]
2714 - }
2715 - }
2716 - },
2717 - "required": [
2718 - "id"
2719 - ]
2720 - },
2721 - "ReasoningEffortEnum": {
2722 - "type": "string",
2723 - "nullable": true,
2724 - "enum": [
2725 - "xhigh",
2726 - "high",
2727 - "medium",
2728 - "low",
2729 - "minimal",
2730 - "none"
2731 - ],
2732 - "x-speakeasy-unknown-values": "allow"
2733 - },
2734 - "ReasoningSummaryVerbosityEnum": {
2735 - "type": "string",
2736 - "nullable": true,
2737 - "enum": [
2738 - "auto",
2739 - "concise",
2740 - "detailed"
2741 - ],
2742 - "example": "auto",
2743 - "x-speakeasy-unknown-values": "allow"
2744 - },
2745 - "BaseReasoningConfig": {
2746 - "type": "object",
2747 - "nullable": true,
2748 - "properties": {
2749 - "effort": {
2750 - "$ref": "#/components/schemas/ReasoningEffortEnum"
2751 - },
2752 - "summary": {
2753 - "$ref": "#/components/schemas/ReasoningSummaryVerbosityEnum"
2754 - }
2755 - }
2756 - },
2757 - "TruncationEnum": {
2758 - "type": "string",
2759 - "nullable": true,
2760 - "enum": [
2761 - "auto",
2762 - "disabled"
2763 - ],
2764 - "x-speakeasy-unknown-values": "allow"
2765 - },
2766 - "FormatTextConfig": {
2767 - "type": "object",
2768 - "properties": {
2769 - "type": {
2770 - "type": "string",
2771 - "enum": [
2772 - "text"
2773 - ]
2774 - }
2775 - },
2776 - "required": [
2777 - "type"
2778 - ],
2779 - "description": "Plain text response format",
2780 - "example": {
2781 - "type": "text"
2782 - }
2783 - },
2784 - "FormatJsonObjectConfig": {
2785 - "type": "object",
2786 - "properties": {
2787 - "type": {
2788 - "type": "string",
2789 - "enum": [
2790 - "json_object"
2791 - ]
2792 - }
2793 - },
2794 - "required": [
2795 - "type"
2796 - ],
2797 - "description": "JSON object response format",
2798 - "example": {
2799 - "type": "json_object"
2800 - }
2801 - },
2802 - "FormatJsonSchemaConfig": {
2803 - "type": "object",
2804 - "properties": {
2805 - "type": {
2806 - "type": "string",
2807 - "enum": [
2808 - "json_schema"
2809 - ]
2810 - },
2811 - "name": {
2812 - "type": "string"
2813 - },
2814 - "description": {
2815 - "type": "string"
2816 - },
2817 - "strict": {
2818 - "type": "boolean",
2819 - "nullable": true
2820 - },
2821 - "schema": {
2822 - "type": "object",
2823 - "additionalProperties": {
2824 - "nullable": true
2825 - }
2826 - }
2827 - },
2828 - "required": [
2829 - "type",
2830 - "name",
2831 - "schema"
2832 - ],
2833 - "description": "JSON schema constrained response format",
2834 - "example": {
2835 - "type": "json_schema",
2836 - "name": "user_info",
2837 - "description": "User information schema",
2838 - "schema": {
2839 - "type": "object",
2840 - "properties": {
2841 - "name": {
2842 - "type": "string"
2843 - },
2844 - "age": {
2845 - "type": "number"
2846 - }
2847 - },
2848 - "required": [
2849 - "name"
2850 - ]
2851 - }
2852 - }
2853 - },
2854 - "Formats": {
2855 - "anyOf": [
2856 - {
2857 - "$ref": "#/components/schemas/FormatTextConfig"
2858 - },
2859 - {
2860 - "$ref": "#/components/schemas/FormatJsonObjectConfig"
2861 - },
2862 - {
2863 - "$ref": "#/components/schemas/FormatJsonSchemaConfig"
2864 - }
2865 - ],
2866 - "description": "Text response format configuration",
2867 - "example": {
2868 - "type": "text"
2869 - }
2870 - },
2871 - "TextConfig": {
2872 - "type": "object",
2873 - "properties": {
2874 - "format": {
2875 - "$ref": "#/components/schemas/Formats"
2876 - },
2877 - "verbosity": {
2878 - "type": "string",
2879 - "nullable": true,
2880 - "enum": [
2881 - "high",
2882 - "low",
2883 - "medium"
2884 - ],
2885 - "x-speakeasy-unknown-values": "allow"
2886 - }
2887 - },
2888 - "description": "Text output configuration including format and verbosity",
2889 - "example": {
2890 - "format": {
2891 - "type": "text"
2892 - },
2893 - "verbosity": "medium"
2894 - }
2895 - },
2896 - "ServiceTierEnum": {
2897 - "type": "string",
2898 - "nullable": true,
2899 - "enum": [
2900 - "auto",
2901 - "default",
2902 - "flex",
2903 - "priority",
2904 - "scale"
2905 - ],
2906 - "x-speakeasy-unknown-values": "allow"
2907 - },
2908 - "BaseResponsesResult": {
2909 - "type": "object",
2910 - "properties": {
2911 - "id": {
2912 - "type": "string"
2913 - },
2914 - "object": {
2915 - "type": "string",
2916 - "enum": [
2917 - "response"
2918 - ]
2919 - },
2920 - "created_at": {
2921 - "type": "integer"
2922 - },
2923 - "model": {
2924 - "type": "string"
2925 - },
2926 - "status": {
2927 - "$ref": "#/components/schemas/OpenAIResponsesResponseStatus"
2928 - },
2929 - "completed_at": {
2930 - "type": "integer"
2931 - },
2932 - "output": {
2933 - "type": "array",
2934 - "items": {
2935 - "oneOf": [
2936 - {
2937 - "$ref": "#/components/schemas/OutputMessage"
2938 - },
2939 - {
2940 - "$ref": "#/components/schemas/OutputItemReasoning"
2941 - },
2942 - {
2943 - "$ref": "#/components/schemas/OutputItemFunctionCall"
2944 - },
2945 - {
2946 - "$ref": "#/components/schemas/OutputItemWebSearchCall"
2947 - },
2948 - {
2949 - "$ref": "#/components/schemas/OutputItemFileSearchCall"
2950 - },
2951 - {
2952 - "$ref": "#/components/schemas/OutputItemImageGenerationCall"
2953 - }
2954 - ],
2955 - "discriminator": {
2956 - "propertyName": "type",
2957 - "mapping": {
2958 - "message": "#/components/schemas/OutputMessage",
2959 - "reasoning": "#/components/schemas/OutputItemReasoning",
2960 - "function_call": "#/components/schemas/OutputItemFunctionCall",
2961 - "web_search_call": "#/components/schemas/OutputItemWebSearchCall",
2962 - "file_search_call": "#/components/schemas/OutputItemFileSearchCall",
2963 - "image_generation_call": "#/components/schemas/OutputItemImageGenerationCall"
2964 - }
2965 - }
2966 - }
2967 - },
2968 - "user": {
2969 - "type": "string",
2970 - "nullable": true
2971 - },
2972 - "output_text": {
2973 - "type": "string"
2974 - },
2975 - "prompt_cache_key": {
2976 - "type": "string",
2977 - "nullable": true
2978 - },
2979 - "safety_identifier": {
2980 - "type": "string",
2981 - "nullable": true
2982 - },
2983 - "error": {
2984 - "$ref": "#/components/schemas/ResponsesErrorField"
2985 - },
2986 - "incomplete_details": {
2987 - "$ref": "#/components/schemas/IncompleteDetails"
2988 - },
2989 - "usage": {
2990 - "$ref": "#/components/schemas/OpenAIResponsesUsage"
2991 - },
2992 - "max_tool_calls": {
2993 - "type": "integer"
2994 - },
2995 - "top_logprobs": {
2996 - "type": "integer"
2997 - },
2998 - "max_output_tokens": {
2999 - "type": "integer"
3000 - },
3001 - "temperature": {
3002 - "type": "number",
3003 - "format": "double"
3004 - },
3005 - "top_p": {
3006 - "type": "number",
3007 - "format": "double"
3008 - },
3009 - "presence_penalty": {
3010 - "type": "number",
3011 - "format": "double"
3012 - },
3013 - "frequency_penalty": {
3014 - "type": "number",
3015 - "format": "double"
3016 - },
3017 - "instructions": {
3018 - "$ref": "#/components/schemas/BaseInputs"
3019 - },
3020 - "metadata": {
3021 - "$ref": "#/components/schemas/RequestMetadata"
3022 - },
3023 - "tools": {
3024 - "type": "array",
3025 - "items": {
3026 - "oneOf": [
3027 - {
3028 - "allOf": [
3029 - {
3030 - "$ref": "#/components/schemas/FunctionTool"
3031 - },
3032 - {
3033 - "type": "object",
3034 - "properties": {}
3035 - }
3036 - ],
3037 - "description": "Function tool definition",
3038 - "example": {
3039 - "type": "function",
3040 - "name": "get_weather",
3041 - "description": "Get the current weather in a location",
3042 - "parameters": {
3043 - "type": "object",
3044 - "properties": {
3045 - "location": {
3046 - "type": "string",
3047 - "description": "The city and state"
3048 - },
3049 - "unit": {
3050 - "type": "string",
3051 - "enum": [
3052 - "celsius",
3053 - "fahrenheit"
3054 - ],
3055 - "x-speakeasy-unknown-values": "allow"
3056 - }
3057 - },
3058 - "required": [
3059 - "location"
3060 - ]
3061 - }
3062 - }
3063 - },
3064 - {
3065 - "$ref": "#/components/schemas/Preview_WebSearchServerTool"
3066 - },
3067 - {
3068 - "$ref": "#/components/schemas/Preview_20250311_WebSearchServerTool"
3069 - },
3070 - {
3071 - "$ref": "#/components/schemas/Legacy_WebSearchServerTool"
3072 - },
3073 - {
3074 - "$ref": "#/components/schemas/WebSearchServerTool"
3075 - },
3076 - {
3077 - "$ref": "#/components/schemas/FileSearchServerTool"
3078 - },
3079 - {
3080 - "$ref": "#/components/schemas/ComputerUseServerTool"
3081 - },
3082 - {
3083 - "$ref": "#/components/schemas/CodeInterpreterServerTool"
3084 - },
3085 - {
3086 - "$ref": "#/components/schemas/McpServerTool"
3087 - },
3088 - {
3089 - "$ref": "#/components/schemas/ImageGenerationServerTool"
3090 - },
3091 - {
3092 - "$ref": "#/components/schemas/CodexLocalShellTool"
3093 - },
3094 - {
3095 - "$ref": "#/components/schemas/ShellServerTool"
3096 - },
3097 - {
3098 - "$ref": "#/components/schemas/ApplyPatchServerTool"
3099 - },
3100 - {
3101 - "$ref": "#/components/schemas/CustomTool"
3102 - }
3103 - ]
3104 - }
3105 - },
3106 - "tool_choice": {
3107 - "$ref": "#/components/schemas/OpenAIResponsesToolChoice"
3108 - },
3109 - "parallel_tool_calls": {
3110 - "type": "boolean"
3111 - },
3112 - "prompt": {
3113 - "$ref": "#/components/schemas/StoredPromptTemplate"
3114 - },
3115 - "background": {
3116 - "type": "boolean",
3117 - "nullable": true
3118 - },
3119 - "previous_response_id": {
3120 - "type": "string",
3121 - "nullable": true
3122 - },
3123 - "reasoning": {
3124 - "$ref": "#/components/schemas/BaseReasoningConfig"
3125 - },
3126 - "service_tier": {
3127 - "$ref": "#/components/schemas/ServiceTierEnum"
3128 - },
3129 - "store": {
3130 - "type": "boolean"
3131 - },
3132 - "truncation": {
3133 - "$ref": "#/components/schemas/TruncationEnum"
3134 - },
3135 - "text": {
3136 - "$ref": "#/components/schemas/TextConfig"
3137 - }
3138 - },
3139 - "required": [
3140 - "id",
3141 - "object",
3142 - "created_at",
3143 - "model",
3144 - "status",
3145 - "completed_at",
3146 - "output",
3147 - "error",
3148 - "incomplete_details",
3149 - "temperature",
3150 - "top_p",
3151 - "presence_penalty",
3152 - "frequency_penalty",
3153 - "instructions",
3154 - "metadata",
3155 - "tools",
3156 - "tool_choice",
3157 - "parallel_tool_calls"
3158 - ]
3159 - },
3160 - "OpenResponsesResult": {
3161 - "allOf": [
3162 - {
3163 - "$ref": "#/components/schemas/BaseResponsesResult"
3164 - },
3165 - {
3166 - "type": "object",
3167 - "properties": {
3168 - "output": {
3169 - "type": "array",
3170 - "items": {
3171 - "$ref": "#/components/schemas/OutputItems"
3172 - }
3173 - },
3174 - "usage": {
3175 - "$ref": "#/components/schemas/Usage"
3176 - },
3177 - "service_tier": {
3178 - "type": "string",
3179 - "nullable": true
3180 - }
3181 - }
3182 - }
3183 - ],
3184 - "description": "Complete non-streaming response from the Responses API",
3185 - "example": {
3186 - "id": "resp-abc123",
3187 - "object": "response",
3188 - "created_at": 1704067200,
3189 - "model": "gpt-4",
3190 - "status": "completed",
3191 - "output": [
3192 - {
3193 - "type": "message",
3194 - "id": "msg-abc123",
3195 - "status": "completed",
3196 - "role": "assistant",
3197 - "content": [
3198 - {
3199 - "type": "output_text",
3200 - "text": "Hello! How can I help you today?",
3201 - "annotations": []
3202 - }
3203 - ]
3204 - }
3205 - ],
3206 - "usage": {
3207 - "input_tokens": 10,
3208 - "output_tokens": 25,
3209 - "total_tokens": 35,
3210 - "input_tokens_details": {
3211 - "cached_tokens": 0
3212 - },
3213 - "output_tokens_details": {
3214 - "reasoning_tokens": 0
3215 - }
3216 - },
3217 - "tools": [],
3218 - "tool_choice": "auto",
3219 - "parallel_tool_calls": true,
3220 - "error": null,
3221 - "incomplete_details": null,
3222 - "temperature": null,
3223 - "top_p": null,
3224 - "max_output_tokens": null,
3225 - "metadata": null,
3226 - "instructions": null
3227 - }
3228 - },
3229 - "CreatedEvent": {
3230 - "type": "object",
3231 - "properties": {
3232 - "type": {
3233 - "type": "string",
3234 - "enum": [
3235 - "response.created"
3236 - ]
3237 - },
3238 - "response": {
3239 - "$ref": "#/components/schemas/BaseResponsesResult"
3240 - },
3241 - "sequence_number": {
3242 - "type": "integer"
3243 - }
3244 - },
3245 - "required": [
3246 - "type",
3247 - "response",
3248 - "sequence_number"
3249 - ],
3250 - "description": "Event emitted when a response is created",
3251 - "example": {
3252 - "type": "response.created",
3253 - "response": {
3254 - "id": "resp-abc123",
3255 - "object": "response",
3256 - "created_at": 1704067200,
3257 - "model": "gpt-4",
3258 - "status": "in_progress",
3259 - "output": [],
3260 - "tools": [],
3261 - "tool_choice": "auto",
3262 - "parallel_tool_calls": true,
3263 - "error": null,
3264 - "incomplete_details": null,
3265 - "metadata": null,
3266 - "instructions": null,
3267 - "temperature": null,
3268 - "top_p": null,
3269 - "max_output_tokens": null
3270 - },
3271 - "sequence_number": 0
3272 - }
3273 - },
3274 - "InProgressEvent": {
3275 - "type": "object",
3276 - "properties": {
3277 - "type": {
3278 - "type": "string",
3279 - "enum": [
3280 - "response.in_progress"
3281 - ]
3282 - },
3283 - "response": {
3284 - "$ref": "#/components/schemas/BaseResponsesResult"
3285 - },
3286 - "sequence_number": {
3287 - "type": "integer"
3288 - }
3289 - },
3290 - "required": [
3291 - "type",
3292 - "response",
3293 - "sequence_number"
3294 - ],
3295 - "description": "Event emitted when a response is in progress",
3296 - "example": {
3297 - "type": "response.in_progress",
3298 - "response": {
3299 - "id": "resp-abc123",
3300 - "object": "response",
3301 - "created_at": 1704067200,
3302 - "model": "gpt-4",
3303 - "status": "in_progress",
3304 - "output": [],
3305 - "tools": [],
3306 - "tool_choice": "auto",
3307 - "parallel_tool_calls": true,
3308 - "error": null,
3309 - "incomplete_details": null,
3310 - "metadata": null,
3311 - "instructions": null,
3312 - "temperature": null,
3313 - "top_p": null,
3314 - "max_output_tokens": null
3315 - },
3316 - "sequence_number": 1
3317 - }
3318 - },
3319 - "CompletedEvent": {
3320 - "type": "object",
3321 - "properties": {
3322 - "type": {
3323 - "type": "string",
3324 - "enum": [
3325 - "response.completed"
3326 - ]
3327 - },
3328 - "response": {
3329 - "$ref": "#/components/schemas/BaseResponsesResult"
3330 - },
3331 - "sequence_number": {
3332 - "type": "integer"
3333 - }
3334 - },
3335 - "required": [
3336 - "type",
3337 - "response",
3338 - "sequence_number"
3339 - ],
3340 - "description": "Event emitted when a response has completed successfully",
3341 - "example": {
3342 - "type": "response.completed",
3343 - "response": {
3344 - "id": "resp-abc123",
3345 - "object": "response",
3346 - "created_at": 1704067200,
3347 - "model": "gpt-4",
3348 - "status": "completed",
3349 - "output": [
3350 - {
3351 - "id": "item-1",
3352 - "type": "message",
3353 - "status": "completed",
3354 - "role": "assistant",
3355 - "content": [
3356 - {
3357 - "type": "output_text",
3358 - "text": "Hello! How can I help you?",
3359 - "annotations": []
3360 - }
3361 - ]
3362 - }
3363 - ],
3364 - "tools": [],
3365 - "tool_choice": "auto",
3366 - "parallel_tool_calls": true,
3367 - "error": null,
3368 - "incomplete_details": null,
3369 - "metadata": null,
3370 - "instructions": null,
3371 - "temperature": null,
3372 - "top_p": null,
3373 - "max_output_tokens": null
3374 - },
3375 - "sequence_number": 10
3376 - }
3377 - },
3378 - "IncompleteEvent": {
3379 - "type": "object",
3380 - "properties": {
3381 - "type": {
3382 - "type": "string",
3383 - "enum": [
3384 - "response.incomplete"
3385 - ]
3386 - },
3387 - "response": {
3388 - "$ref": "#/components/schemas/BaseResponsesResult"
3389 - },
3390 - "sequence_number": {
3391 - "type": "integer"
3392 - }
3393 - },
3394 - "required": [
3395 - "type",
3396 - "response",
3397 - "sequence_number"
3398 - ],
3399 - "description": "Event emitted when a response is incomplete",
3400 - "example": {
3401 - "type": "response.incomplete",
3402 - "response": {
3403 - "id": "resp-abc123",
3404 - "object": "response",
3405 - "created_at": 1704067200,
3406 - "model": "gpt-4",
3407 - "status": "incomplete",
3408 - "output": [],
3409 - "tools": [],
3410 - "tool_choice": "auto",
3411 - "parallel_tool_calls": true,
3412 - "error": null,
3413 - "incomplete_details": null,
3414 - "metadata": null,
3415 - "instructions": null,
3416 - "temperature": null,
3417 - "top_p": null,
3418 - "max_output_tokens": null
3419 - },
3420 - "sequence_number": 5
3421 - }
3422 - },
3423 - "FailedEvent": {
3424 - "type": "object",
3425 - "properties": {
3426 - "type": {
3427 - "type": "string",
3428 - "enum": [
3429 - "response.failed"
3430 - ]
3431 - },
3432 - "response": {
3433 - "$ref": "#/components/schemas/BaseResponsesResult"
3434 - },
3435 - "sequence_number": {
3436 - "type": "integer"
3437 - }
3438 - },
3439 - "required": [
3440 - "type",
3441 - "response",
3442 - "sequence_number"
3443 - ],
3444 - "description": "Event emitted when a response has failed",
3445 - "example": {
3446 - "type": "response.failed",
3447 - "response": {
3448 - "id": "resp-abc123",
3449 - "object": "response",
3450 - "created_at": 1704067200,
3451 - "model": "gpt-4",
3452 - "status": "failed",
3453 - "output": [],
3454 - "tools": [],
3455 - "tool_choice": "auto",
3456 - "parallel_tool_calls": true,
3457 - "error": null,
3458 - "incomplete_details": null,
3459 - "metadata": null,
3460 - "instructions": null,
3461 - "temperature": null,
3462 - "top_p": null,
3463 - "max_output_tokens": null
3464 - },
3465 - "sequence_number": 3
3466 - }
3467 - },
3468 - "BaseErrorEvent": {
3469 - "type": "object",
3470 - "properties": {
3471 - "type": {
3472 - "type": "string",
3473 - "enum": [
3474 - "error"
3475 - ]
3476 - },
3477 - "code": {
3478 - "type": "string",
3479 - "nullable": true
3480 - },
3481 - "message": {
3482 - "type": "string"
3483 - },
3484 - "param": {
3485 - "type": "string",
3486 - "nullable": true
3487 - },
3488 - "sequence_number": {
3489 - "type": "integer"
3490 - }
3491 - },
3492 - "required": [
3493 - "type",
3494 - "code",
3495 - "message",
3496 - "param",
3497 - "sequence_number"
3498 - ],
3499 - "description": "Event emitted when an error occurs during streaming",
3500 - "example": {
3501 - "type": "error",
3502 - "code": "rate_limit_exceeded",
3503 - "message": "Rate limit exceeded. Please try again later.",
3504 - "param": null,
3505 - "sequence_number": 2
3506 - }
3507 - },
3508 - "ErrorEvent": {
3509 - "allOf": [
3510 - {
3511 - "$ref": "#/components/schemas/BaseErrorEvent"
3512 - },
3513 - {
3514 - "type": "object",
3515 - "properties": {}
3516 - }
3517 - ],
3518 - "description": "Event emitted when an error occurs during streaming",
3519 - "example": {
3520 - "type": "error",
3521 - "code": "rate_limit_exceeded",
3522 - "message": "Rate limit exceeded. Please try again later.",
3523 - "param": null,
3524 - "sequence_number": 2
3525 - }
3526 - },
3527 - "OutputItemAddedEvent": {
3528 - "type": "object",
3529 - "properties": {
3530 - "type": {
3531 - "type": "string",
3532 - "enum": [
3533 - "response.output_item.added"
3534 - ]
3535 - },
3536 - "output_index": {
3537 - "type": "integer"
3538 - },
3539 - "item": {
3540 - "oneOf": [
3541 - {
3542 - "$ref": "#/components/schemas/OutputMessage"
3543 - },
3544 - {
3545 - "$ref": "#/components/schemas/OutputItemReasoning"
3546 - },
3547 - {
3548 - "$ref": "#/components/schemas/OutputItemFunctionCall"
3549 - },
3550 - {
3551 - "$ref": "#/components/schemas/OutputItemWebSearchCall"
3552 - },
3553 - {
3554 - "$ref": "#/components/schemas/OutputItemFileSearchCall"
3555 - },
3556 - {
3557 - "$ref": "#/components/schemas/OutputItemImageGenerationCall"
3558 - }
3559 - ],
3560 - "discriminator": {
3561 - "propertyName": "type",
3562 - "mapping": {
3563 - "message": "#/components/schemas/OutputMessage",
3564 - "reasoning": "#/components/schemas/OutputItemReasoning",
3565 - "function_call": "#/components/schemas/OutputItemFunctionCall",
3566 - "web_search_call": "#/components/schemas/OutputItemWebSearchCall",
3567 - "file_search_call": "#/components/schemas/OutputItemFileSearchCall",
3568 - "image_generation_call": "#/components/schemas/OutputItemImageGenerationCall"
3569 - }
3570 - }
3571 - },
3572 - "sequence_number": {
3573 - "type": "integer"
3574 - }
3575 - },
3576 - "required": [
3577 - "type",
3578 - "output_index",
3579 - "item",
3580 - "sequence_number"
3581 - ],
3582 - "description": "Event emitted when a new output item is added to the response",
3583 - "example": {
3584 - "type": "response.output_item.added",
3585 - "output_index": 0,
3586 - "item": {
3587 - "id": "item-1",
3588 - "type": "message",
3589 - "status": "in_progress",
3590 - "role": "assistant",
3591 - "content": []
3592 - },
3593 - "sequence_number": 2
3594 - }
3595 - },
3596 - "OutputItemDoneEvent": {
3597 - "type": "object",
3598 - "properties": {
3599 - "type": {
3600 - "type": "string",
3601 - "enum": [
3602 - "response.output_item.done"
3603 - ]
3604 - },
3605 - "output_index": {
3606 - "type": "integer"
3607 - },
3608 - "item": {
3609 - "oneOf": [
3610 - {
3611 - "$ref": "#/components/schemas/OutputMessage"
3612 - },
3613 - {
3614 - "$ref": "#/components/schemas/OutputItemReasoning"
3615 - },
3616 - {
3617 - "$ref": "#/components/schemas/OutputItemFunctionCall"
3618 - },
3619 - {
3620 - "$ref": "#/components/schemas/OutputItemWebSearchCall"
3621 - },
3622 - {
3623 - "$ref": "#/components/schemas/OutputItemFileSearchCall"
3624 - },
3625 - {
3626 - "$ref": "#/components/schemas/OutputItemImageGenerationCall"
3627 - }
3628 - ],
3629 - "discriminator": {
3630 - "propertyName": "type",
3631 - "mapping": {
3632 - "message": "#/components/schemas/OutputMessage",
3633 - "reasoning": "#/components/schemas/OutputItemReasoning",
3634 - "function_call": "#/components/schemas/OutputItemFunctionCall",
3635 - "web_search_call": "#/components/schemas/OutputItemWebSearchCall",
3636 - "file_search_call": "#/components/schemas/OutputItemFileSearchCall",
3637 - "image_generation_call": "#/components/schemas/OutputItemImageGenerationCall"
3638 - }
3639 - }
3640 - },
3641 - "sequence_number": {
3642 - "type": "integer"
3643 - }
3644 - },
3645 - "required": [
3646 - "type",
3647 - "output_index",
3648 - "item",
3649 - "sequence_number"
3650 - ],
3651 - "description": "Event emitted when an output item is complete",
3652 - "example": {
3653 - "type": "response.output_item.done",
3654 - "output_index": 0,
3655 - "item": {
3656 - "id": "item-1",
3657 - "type": "message",
3658 - "status": "completed",
3659 - "role": "assistant",
3660 - "content": [
3661 - {
3662 - "type": "output_text",
3663 - "text": "Hello! How can I help you?",
3664 - "annotations": []
3665 - }
3666 - ]
3667 - },
3668 - "sequence_number": 8
3669 - }
3670 - },
3671 - "BaseContentPartAddedEvent": {
3672 - "type": "object",
3673 - "properties": {
3674 - "type": {
3675 - "type": "string",
3676 - "enum": [
3677 - "response.content_part.added"
3678 - ]
3679 - },
3680 - "output_index": {
3681 - "type": "integer"
3682 - },
3683 - "item_id": {
3684 - "type": "string"
3685 - },
3686 - "content_index": {
3687 - "type": "integer"
3688 - },
3689 - "part": {
3690 - "anyOf": [
3691 - {
3692 - "$ref": "#/components/schemas/ResponseOutputText"
3693 - },
3694 - {
3695 - "$ref": "#/components/schemas/OpenAIResponsesRefusalContent"
3696 - }
3697 - ]
3698 - },
3699 - "sequence_number": {
3700 - "type": "integer"
3701 - }
3702 - },
3703 - "required": [
3704 - "type",
3705 - "output_index",
3706 - "item_id",
3707 - "content_index",
3708 - "part",
3709 - "sequence_number"
3710 - ],
3711 - "description": "Event emitted when a new content part is added to an output item",
3712 - "example": {
3713 - "type": "response.content_part.added",
3714 - "output_index": 0,
3715 - "item_id": "item-1",
3716 - "content_index": 0,
3717 - "part": {
3718 - "type": "output_text",
3719 - "text": "",
3720 - "annotations": []
3721 - },
3722 - "sequence_number": 3
3723 - }
3724 - },
3725 - "ContentPartAddedEvent": {
3726 - "allOf": [
3727 - {
3728 - "$ref": "#/components/schemas/BaseContentPartAddedEvent"
3729 - },
3730 - {
3731 - "type": "object",
3732 - "properties": {
3733 - "part": {
3734 - "anyOf": [
3735 - {
3736 - "$ref": "#/components/schemas/ResponseOutputText"
3737 - },
3738 - {
3739 - "$ref": "#/components/schemas/ReasoningTextContent"
3740 - },
3741 - {
3742 - "$ref": "#/components/schemas/OpenAIResponsesRefusalContent"
3743 - }
3744 - ]
3745 - }
3746 - }
3747 - }
3748 - ],
3749 - "description": "Event emitted when a new content part is added to an output item",
3750 - "example": {
3751 - "type": "response.content_part.added",
3752 - "output_index": 0,
3753 - "item_id": "item-1",
3754 - "content_index": 0,
3755 - "part": {
3756 - "type": "output_text",
3757 - "text": "",
3758 - "annotations": []
3759 - },
3760 - "sequence_number": 3
3761 - }
3762 - },
3763 - "BaseContentPartDoneEvent": {
3764 - "type": "object",
3765 - "properties": {
3766 - "type": {
3767 - "type": "string",
3768 - "enum": [
3769 - "response.content_part.done"
3770 - ]
3771 - },
3772 - "output_index": {
3773 - "type": "integer"
3774 - },
3775 - "item_id": {
3776 - "type": "string"
3777 - },
3778 - "content_index": {
3779 - "type": "integer"
3780 - },
3781 - "part": {
3782 - "anyOf": [
3783 - {
3784 - "$ref": "#/components/schemas/ResponseOutputText"
3785 - },
3786 - {
3787 - "$ref": "#/components/schemas/OpenAIResponsesRefusalContent"
3788 - }
3789 - ]
3790 - },
3791 - "sequence_number": {
3792 - "type": "integer"
3793 - }
3794 - },
3795 - "required": [
3796 - "type",
3797 - "output_index",
3798 - "item_id",
3799 - "content_index",
3800 - "part",
3801 - "sequence_number"
3802 - ],
3803 - "description": "Event emitted when a content part is complete",
3804 - "example": {
3805 - "type": "response.content_part.done",
3806 - "output_index": 0,
3807 - "item_id": "item-1",
3808 - "content_index": 0,
3809 - "part": {
3810 - "type": "output_text",
3811 - "text": "Hello! How can I help you?",
3812 - "annotations": []
3813 - },
3814 - "sequence_number": 7
3815 - }
3816 - },
3817 - "ContentPartDoneEvent": {
3818 - "allOf": [
3819 - {
3820 - "$ref": "#/components/schemas/BaseContentPartDoneEvent"
3821 - },
3822 - {
3823 - "type": "object",
3824 - "properties": {
3825 - "part": {
3826 - "anyOf": [
3827 - {
3828 - "$ref": "#/components/schemas/ResponseOutputText"
3829 - },
3830 - {
3831 - "$ref": "#/components/schemas/ReasoningTextContent"
3832 - },
3833 - {
3834 - "$ref": "#/components/schemas/OpenAIResponsesRefusalContent"
3835 - }
3836 - ]
3837 - }
3838 - }
3839 - }
3840 - ],
3841 - "description": "Event emitted when a content part is complete",
3842 - "example": {
3843 - "type": "response.content_part.done",
3844 - "output_index": 0,
3845 - "item_id": "item-1",
3846 - "content_index": 0,
3847 - "part": {
3848 - "type": "output_text",
3849 - "text": "Hello! How can I help you?",
3850 - "annotations": []
3851 - },
3852 - "sequence_number": 7
3853 - }
3854 - },
3855 - "OpenResponsesTopLogprobs": {
3856 - "type": "object",
3857 - "properties": {
3858 - "token": {
3859 - "type": "string"
3860 - },
3861 - "logprob": {
3862 - "type": "number"
3863 - },
3864 - "bytes": {
3865 - "type": "array",
3866 - "items": {
3867 - "type": "number"
3868 - }
3869 - }
3870 - },
3871 - "description": "Alternative token with its log probability",
3872 - "example": {
3873 - "token": "hello",
3874 - "logprob": -0.5
3875 - }
3876 - },
3877 - "OpenResponsesLogProbs": {
3878 - "type": "object",
3879 - "properties": {
3880 - "logprob": {
3881 - "type": "number"
3882 - },
3883 - "token": {
3884 - "type": "string"
3885 - },
3886 - "top_logprobs": {
3887 - "type": "array",
3888 - "items": {
3889 - "$ref": "#/components/schemas/OpenResponsesTopLogprobs"
3890 - }
3891 - },
3892 - "bytes": {
3893 - "type": "array",
3894 - "items": {
3895 - "type": "number"
3896 - }
3897 - }
3898 - },
3899 - "required": [
3900 - "logprob",
3901 - "token"
3902 - ],
3903 - "description": "Log probability information for a token",
3904 - "example": {
3905 - "logprob": -0.1,
3906 - "token": "world",
3907 - "top_logprobs": [
3908 - {
3909 - "token": "hello",
3910 - "logprob": -0.5
3911 - }
3912 - ]
3913 - }
3914 - },
3915 - "BaseTextDeltaEvent": {
3916 - "type": "object",
3917 - "properties": {
3918 - "type": {
3919 - "type": "string",
3920 - "enum": [
3921 - "response.output_text.delta"
3922 - ]
3923 - },
3924 - "logprobs": {
3925 - "type": "array",
3926 - "items": {
3927 - "$ref": "#/components/schemas/OpenResponsesLogProbs"
3928 - }
3929 - },
3930 - "output_index": {
3931 - "type": "integer"
3932 - },
3933 - "item_id": {
3934 - "type": "string"
3935 - },
3936 - "content_index": {
3937 - "type": "integer"
3938 - },
3939 - "delta": {
3940 - "type": "string"
3941 - },
3942 - "sequence_number": {
3943 - "type": "integer"
3944 - }
3945 - },
3946 - "required": [
3947 - "type",
3948 - "logprobs",
3949 - "output_index",
3950 - "item_id",
3951 - "content_index",
3952 - "delta",
3953 - "sequence_number"
3954 - ],
3955 - "description": "Event emitted when a text delta is streamed",
3956 - "example": {
3957 - "type": "response.output_text.delta",
3958 - "logprobs": [],
3959 - "output_index": 0,
3960 - "item_id": "item-1",
3961 - "content_index": 0,
3962 - "delta": "Hello",
3963 - "sequence_number": 4
3964 - }
3965 - },
3966 - "TextDeltaEvent": {
3967 - "allOf": [
3968 - {
3969 - "$ref": "#/components/schemas/BaseTextDeltaEvent"
3970 - },
3971 - {
3972 - "type": "object",
3973 - "properties": {
3974 - "logprobs": {
3975 - "type": "array",
3976 - "items": {
3977 - "allOf": [
3978 - {
3979 - "$ref": "#/components/schemas/OpenResponsesLogProbs"
3980 - },
3981 - {
3982 - "type": "object",
3983 - "properties": {
3984 - "top_logprobs": {
3985 - "type": "array",
3986 - "items": {
3987 - "allOf": [
3988 - {
3989 - "$ref": "#/components/schemas/OpenResponsesTopLogprobs"
3990 - },
3991 - {
3992 - "type": "object",
3993 - "properties": {
3994 - "bytes": {
3995 - "type": "array",
3996 - "items": {
3997 - "type": "integer"
3998 - }
3999 - }
4000 - }
4001 - }
4002 - ],
4003 - "description": "Alternative token with its log probability",
4004 - "example": {
4005 - "token": "hello",
4006 - "logprob": -0.5
4007 - }
4008 - }
4009 - },
4010 - "bytes": {
4011 - "type": "array",
4012 - "items": {
4013 - "type": "integer"
4014 - }
4015 - }
4016 - }
4017 - }
4018 - ],
4019 - "description": "Log probability information for a token",
4020 - "example": {
4021 - "logprob": -0.1,
4022 - "token": "world",
4023 - "top_logprobs": [
4024 - {
4025 - "token": "hello",
4026 - "logprob": -0.5
4027 - }
4028 - ]
4029 - }
4030 - }
4031 - }
4032 - }
4033 - }
4034 - ],
4035 - "description": "Event emitted when a text delta is streamed",
4036 - "example": {
4037 - "type": "response.output_text.delta",
4038 - "logprobs": [],
4039 - "output_index": 0,
4040 - "item_id": "item-1",
4041 - "content_index": 0,
4042 - "delta": "Hello",
4043 - "sequence_number": 4
4044 - }
4045 - },
4046 - "BaseTextDoneEvent": {
4047 - "type": "object",
4048 - "properties": {
4049 - "type": {
4050 - "type": "string",
4051 - "enum": [
4052 - "response.output_text.done"
4053 - ]
4054 - },
4055 - "output_index": {
4056 - "type": "integer"
4057 - },
4058 - "item_id": {
4059 - "type": "string"
4060 - },
4061 - "content_index": {
4062 - "type": "integer"
4063 - },
4064 - "text": {
4065 - "type": "string"
4066 - },
4067 - "sequence_number": {
4068 - "type": "integer"
4069 - },
4070 - "logprobs": {
4071 - "type": "array",
4072 - "items": {
4073 - "$ref": "#/components/schemas/OpenResponsesLogProbs"
4074 - }
4075 - }
4076 - },
4077 - "required": [
4078 - "type",
4079 - "output_index",
4080 - "item_id",
4081 - "content_index",
4082 - "text",
4083 - "sequence_number",
4084 - "logprobs"
4085 - ],
4086 - "description": "Event emitted when text streaming is complete",
4087 - "example": {
4088 - "type": "response.output_text.done",
4089 - "output_index": 0,
4090 - "item_id": "item-1",
4091 - "content_index": 0,
4092 - "text": "Hello! How can I help you?",
4093 - "sequence_number": 6,
4094 - "logprobs": []
4095 - }
4096 - },
4097 - "TextDoneEvent": {
4098 - "allOf": [
4099 - {
4100 - "$ref": "#/components/schemas/BaseTextDoneEvent"
4101 - },
4102 - {
4103 - "type": "object",
4104 - "properties": {
4105 - "logprobs": {
4106 - "type": "array",
4107 - "items": {
4108 - "allOf": [
4109 - {
4110 - "$ref": "#/components/schemas/OpenResponsesLogProbs"
4111 - },
4112 - {
4113 - "type": "object",
4114 - "properties": {
4115 - "top_logprobs": {
4116 - "type": "array",
4117 - "items": {
4118 - "allOf": [
4119 - {
4120 - "$ref": "#/components/schemas/OpenResponsesTopLogprobs"
4121 - },
4122 - {
4123 - "type": "object",
4124 - "properties": {
4125 - "bytes": {
4126 - "type": "array",
4127 - "items": {
4128 - "type": "integer"
4129 - }
4130 - }
4131 - }
4132 - }
4133 - ],
4134 - "description": "Alternative token with its log probability",
4135 - "example": {
4136 - "token": "hello",
4137 - "logprob": -0.5
4138 - }
4139 - }
4140 - },
4141 - "bytes": {
4142 - "type": "array",
4143 - "items": {
4144 - "type": "integer"
4145 - }
4146 - }
4147 - }
4148 - }
4149 - ],
4150 - "description": "Log probability information for a token",
4151 - "example": {
4152 - "logprob": -0.1,
4153 - "token": "world",
4154 - "top_logprobs": [
4155 - {
4156 - "token": "hello",
4157 - "logprob": -0.5
4158 - }
4159 - ]
4160 - }
4161 - }
4162 - }
4163 - }
4164 - }
4165 - ],
4166 - "description": "Event emitted when text streaming is complete",
4167 - "example": {
4168 - "type": "response.output_text.done",
4169 - "output_index": 0,
4170 - "item_id": "item-1",
4171 - "content_index": 0,
4172 - "text": "Hello! How can I help you?",
4173 - "sequence_number": 6,
4174 - "logprobs": []
4175 - }
4176 - },
4177 - "BaseRefusalDeltaEvent": {
4178 - "type": "object",
4179 - "properties": {
4180 - "type": {
4181 - "type": "string",
4182 - "enum": [
4183 - "response.refusal.delta"
4184 - ]
4185 - },
4186 - "output_index": {
4187 - "type": "integer"
4188 - },
4189 - "item_id": {
4190 - "type": "string"
4191 - },
4192 - "content_index": {
4193 - "type": "integer"
4194 - },
4195 - "delta": {
4196 - "type": "string"
4197 - },
4198 - "sequence_number": {
4199 - "type": "integer"
4200 - }
4201 - },
4202 - "required": [
4203 - "type",
4204 - "output_index",
4205 - "item_id",
4206 - "content_index",
4207 - "delta",
4208 - "sequence_number"
4209 - ],
4210 - "description": "Event emitted when a refusal delta is streamed",
4211 - "example": {
4212 - "type": "response.refusal.delta",
4213 - "output_index": 0,
4214 - "item_id": "item-1",
4215 - "content_index": 0,
4216 - "delta": "I'm sorry",
4217 - "sequence_number": 4
4218 - }
4219 - },
4220 - "RefusalDeltaEvent": {
4221 - "allOf": [
4222 - {
4223 - "$ref": "#/components/schemas/BaseRefusalDeltaEvent"
4224 - },
4225 - {
4226 - "type": "object",
4227 - "properties": {}
4228 - }
4229 - ],
4230 - "description": "Event emitted when a refusal delta is streamed",
4231 - "example": {
4232 - "type": "response.refusal.delta",
4233 - "output_index": 0,
4234 - "item_id": "item-1",
4235 - "content_index": 0,
4236 - "delta": "I'm sorry",
4237 - "sequence_number": 4
4238 - }
4239 - },
4240 - "BaseRefusalDoneEvent": {
4241 - "type": "object",
4242 - "properties": {
4243 - "type": {
4244 - "type": "string",
4245 - "enum": [
4246 - "response.refusal.done"
4247 - ]
4248 - },
4249 - "output_index": {
4250 - "type": "integer"
4251 - },
4252 - "item_id": {
4253 - "type": "string"
4254 - },
4255 - "content_index": {
4256 - "type": "integer"
4257 - },
4258 - "refusal": {
4259 - "type": "string"
4260 - },
4261 - "sequence_number": {
4262 - "type": "integer"
4263 - }
4264 - },
4265 - "required": [
4266 - "type",
4267 - "output_index",
4268 - "item_id",
4269 - "content_index",
4270 - "refusal",
4271 - "sequence_number"
4272 - ],
4273 - "description": "Event emitted when refusal streaming is complete",
4274 - "example": {
4275 - "type": "response.refusal.done",
4276 - "output_index": 0,
4277 - "item_id": "item-1",
4278 - "content_index": 0,
4279 - "refusal": "I'm sorry, but I can't assist with that request.",
4280 - "sequence_number": 6
4281 - }
4282 - },
4283 - "RefusalDoneEvent": {
4284 - "allOf": [
4285 - {
4286 - "$ref": "#/components/schemas/BaseRefusalDoneEvent"
4287 - },
4288 - {
4289 - "type": "object",
4290 - "properties": {}
4291 - }
4292 - ],
4293 - "description": "Event emitted when refusal streaming is complete",
4294 - "example": {
4295 - "type": "response.refusal.done",
4296 - "output_index": 0,
4297 - "item_id": "item-1",
4298 - "content_index": 0,
4299 - "refusal": "I'm sorry, but I can't assist with that request.",
4300 - "sequence_number": 6
4301 - }
4302 - },
4303 - "BaseAnnotationAddedEvent": {
4304 - "type": "object",
4305 - "properties": {
4306 - "type": {
4307 - "type": "string",
4308 - "enum": [
4309 - "response.output_text.annotation.added"
4310 - ]
4311 - },
4312 - "output_index": {
4313 - "type": "integer"
4314 - },
4315 - "item_id": {
4316 - "type": "string"
4317 - },
4318 - "content_index": {
4319 - "type": "integer"
4320 - },
4321 - "sequence_number": {
4322 - "type": "integer"
4323 - },
4324 - "annotation_index": {
4325 - "type": "integer"
4326 - },
4327 - "annotation": {
4328 - "$ref": "#/components/schemas/OpenAIResponsesAnnotation"
4329 - }
4330 - },
4331 - "required": [
4332 - "type",
4333 - "output_index",
4334 - "item_id",
4335 - "content_index",
4336 - "sequence_number",
4337 - "annotation_index",
4338 - "annotation"
4339 - ],
4340 - "description": "Event emitted when a text annotation is added to output",
4341 - "example": {
4342 - "type": "response.output_text.annotation.added",
4343 - "output_index": 0,
4344 - "item_id": "item-1",
4345 - "content_index": 0,
4346 - "sequence_number": 5,
4347 - "annotation_index": 0,
4348 - "annotation": {
4349 - "type": "url_citation",
4350 - "url": "https://example.com",
4351 - "title": "Example",
4352 - "start_index": 0,
4353 - "end_index": 7
4354 - }
4355 - }
4356 - },
4357 - "AnnotationAddedEvent": {
4358 - "allOf": [
4359 - {
4360 - "$ref": "#/components/schemas/BaseAnnotationAddedEvent"
4361 - },
4362 - {
4363 - "type": "object",
4364 - "properties": {}
4365 - }
4366 - ],
4367 - "description": "Event emitted when a text annotation is added to output",
4368 - "example": {
4369 - "type": "response.output_text.annotation.added",
4370 - "output_index": 0,
4371 - "item_id": "item-1",
4372 - "content_index": 0,
4373 - "sequence_number": 5,
4374 - "annotation_index": 0,
4375 - "annotation": {
4376 - "type": "url_citation",
4377 - "url": "https://example.com",
4378 - "title": "Example",
4379 - "start_index": 0,
4380 - "end_index": 7
4381 - }
4382 - }
4383 - },
4384 - "BaseFunctionCallArgsDeltaEvent": {
4385 - "type": "object",
4386 - "properties": {
4387 - "type": {
4388 - "type": "string",
4389 - "enum": [
4390 - "response.function_call_arguments.delta"
4391 - ]
4392 - },
4393 - "item_id": {
4394 - "type": "string"
4395 - },
4396 - "output_index": {
4397 - "type": "integer"
4398 - },
4399 - "delta": {
4400 - "type": "string"
4401 - },
4402 - "sequence_number": {
4403 - "type": "integer"
4404 - }
4405 - },
4406 - "required": [
4407 - "type",
4408 - "item_id",
4409 - "output_index",
4410 - "delta",
4411 - "sequence_number"
4412 - ],
4413 - "description": "Event emitted when function call arguments are being streamed",
4414 - "example": {
4415 - "type": "response.function_call_arguments.delta",
4416 - "item_id": "item-1",
4417 - "output_index": 0,
4418 - "delta": "{\"city\": \"San",
4419 - "sequence_number": 4
4420 - }
4421 - },
4422 - "FunctionCallArgsDeltaEvent": {
4423 - "allOf": [
4424 - {
4425 - "$ref": "#/components/schemas/BaseFunctionCallArgsDeltaEvent"
4426 - },
4427 - {
4428 - "type": "object",
4429 - "properties": {}
4430 - }
4431 - ],
4432 - "description": "Event emitted when function call arguments are being streamed",
4433 - "example": {
4434 - "type": "response.function_call_arguments.delta",
4435 - "item_id": "item-1",
4436 - "output_index": 0,
4437 - "delta": "{\"city\": \"San",
4438 - "sequence_number": 4
4439 - }
4440 - },
4441 - "BaseFunctionCallArgsDoneEvent": {
4442 - "type": "object",
4443 - "properties": {
4444 - "type": {
4445 - "type": "string",
4446 - "enum": [
4447 - "response.function_call_arguments.done"
4448 - ]
4449 - },
4450 - "item_id": {
4451 - "type": "string"
4452 - },
4453 - "output_index": {
4454 - "type": "integer"
4455 - },
4456 - "name": {
4457 - "type": "string"
4458 - },
4459 - "arguments": {
4460 - "type": "string"
4461 - },
4462 - "sequence_number": {
4463 - "type": "integer"
4464 - }
4465 - },
4466 - "required": [
4467 - "type",
4468 - "item_id",
4469 - "output_index",
4470 - "name",
4471 - "arguments",
4472 - "sequence_number"
4473 - ],
4474 - "description": "Event emitted when function call arguments streaming is complete",
4475 - "example": {
4476 - "type": "response.function_call_arguments.done",
4477 - "item_id": "item-1",
4478 - "output_index": 0,
4479 - "name": "get_weather",
4480 - "arguments": "{\"city\": \"San Francisco\", \"units\": \"celsius\"}",
4481 - "sequence_number": 6
4482 - }
4483 - },
4484 - "FunctionCallArgsDoneEvent": {
4485 - "allOf": [
4486 - {
4487 - "$ref": "#/components/schemas/BaseFunctionCallArgsDoneEvent"
4488 - },
4489 - {
4490 - "type": "object",
4491 - "properties": {}
4492 - }
4493 - ],
4494 - "description": "Event emitted when function call arguments streaming is complete",
4495 - "example": {
4496 - "type": "response.function_call_arguments.done",
4497 - "item_id": "item-1",
4498 - "output_index": 0,
4499 - "name": "get_weather",
4500 - "arguments": "{\"city\": \"San Francisco\", \"units\": \"celsius\"}",
4501 - "sequence_number": 6
4502 - }
4503 - },
4504 - "BaseReasoningDeltaEvent": {
4505 - "type": "object",
4506 - "properties": {
4507 - "type": {
4508 - "type": "string",
4509 - "enum": [
4510 - "response.reasoning_text.delta"
4511 - ]
4512 - },
4513 - "output_index": {
4514 - "type": "integer"
4515 - },
4516 - "item_id": {
4517 - "type": "string"
4518 - },
4519 - "content_index": {
4520 - "type": "integer"
4521 - },
4522 - "delta": {
4523 - "type": "string"
4524 - },
4525 - "sequence_number": {
4526 - "type": "integer"
4527 - }
4528 - },
4529 - "required": [
4530 - "type",
4531 - "output_index",
4532 - "item_id",
4533 - "content_index",
4534 - "delta",
4535 - "sequence_number"
4536 - ],
4537 - "description": "Event emitted when reasoning text delta is streamed",
4538 - "example": {
4539 - "type": "response.reasoning_text.delta",
4540 - "output_index": 0,
4541 - "item_id": "item-1",
4542 - "content_index": 0,
4543 - "delta": "First, we need",
4544 - "sequence_number": 4
4545 - }
4546 - },
4547 - "ReasoningDeltaEvent": {
4548 - "allOf": [
4549 - {
4550 - "$ref": "#/components/schemas/BaseReasoningDeltaEvent"
4551 - },
4552 - {
4553 - "type": "object",
4554 - "properties": {}
4555 - }
4556 - ],
4557 - "description": "Event emitted when reasoning text delta is streamed",
4558 - "example": {
4559 - "type": "response.reasoning_text.delta",
4560 - "output_index": 0,
4561 - "item_id": "item-1",
4562 - "content_index": 0,
4563 - "delta": "First, we need",
4564 - "sequence_number": 4
4565 - }
4566 - },
4567 - "BaseReasoningDoneEvent": {
4568 - "type": "object",
4569 - "properties": {
4570 - "type": {
4571 - "type": "string",
4572 - "enum": [
4573 - "response.reasoning_text.done"
4574 - ]
4575 - },
4576 - "output_index": {
4577 - "type": "integer"
4578 - },
4579 - "item_id": {
4580 - "type": "string"
4581 - },
4582 - "content_index": {
4583 - "type": "integer"
4584 - },
4585 - "text": {
4586 - "type": "string"
4587 - },
4588 - "sequence_number": {
4589 - "type": "integer"
4590 - }
4591 - },
4592 - "required": [
4593 - "type",
4594 - "output_index",
4595 - "item_id",
4596 - "content_index",
4597 - "text",
4598 - "sequence_number"
4599 - ],
4600 - "description": "Event emitted when reasoning text streaming is complete",
4601 - "example": {
4602 - "type": "response.reasoning_text.done",
4603 - "output_index": 0,
4604 - "item_id": "item-1",
4605 - "content_index": 0,
4606 - "text": "First, we need to identify the key components and then combine them logically.",
4607 - "sequence_number": 6
4608 - }
4609 - },
4610 - "ReasoningDoneEvent": {
4611 - "allOf": [
4612 - {
4613 - "$ref": "#/components/schemas/BaseReasoningDoneEvent"
4614 - },
4615 - {
4616 - "type": "object",
4617 - "properties": {}
4618 - }
4619 - ],
4620 - "description": "Event emitted when reasoning text streaming is complete",
4621 - "example": {
4622 - "type": "response.reasoning_text.done",
4623 - "output_index": 0,
4624 - "item_id": "item-1",
4625 - "content_index": 0,
4626 - "text": "First, we need to identify the key components and then combine them logically.",
4627 - "sequence_number": 6
4628 - }
4629 - },
4630 - "BaseReasoningSummaryPartAddedEvent": {
4631 - "type": "object",
4632 - "properties": {
4633 - "type": {
4634 - "type": "string",
4635 - "enum": [
4636 - "response.reasoning_summary_part.added"
4637 - ]
4638 - },
4639 - "output_index": {
4640 - "type": "integer"
4641 - },
4642 - "item_id": {
4643 - "type": "string"
4644 - },
4645 - "summary_index": {
4646 - "type": "integer"
4647 - },
4648 - "part": {
4649 - "$ref": "#/components/schemas/ReasoningSummaryText"
4650 - },
4651 - "sequence_number": {
4652 - "type": "integer"
4653 - }
4654 - },
4655 - "required": [
4656 - "type",
4657 - "output_index",
4658 - "item_id",
4659 - "summary_index",
4660 - "part",
4661 - "sequence_number"
4662 - ],
4663 - "description": "Event emitted when a reasoning summary part is added",
4664 - "example": {
4665 - "type": "response.reasoning_summary_part.added",
4666 - "output_index": 0,
4667 - "item_id": "item-1",
4668 - "summary_index": 0,
4669 - "part": {
4670 - "type": "summary_text",
4671 - "text": ""
4672 - },
4673 - "sequence_number": 3
4674 - }
4675 - },
4676 - "ReasoningSummaryPartAddedEvent": {
4677 - "allOf": [
4678 - {
4679 - "$ref": "#/components/schemas/BaseReasoningSummaryPartAddedEvent"
4680 - },
4681 - {
4682 - "type": "object",
4683 - "properties": {}
4684 - }
4685 - ],
4686 - "description": "Event emitted when a reasoning summary part is added",
4687 - "example": {
4688 - "type": "response.reasoning_summary_part.added",
4689 - "output_index": 0,
4690 - "item_id": "item-1",
4691 - "summary_index": 0,
4692 - "part": {
4693 - "type": "summary_text",
4694 - "text": ""
4695 - },
4696 - "sequence_number": 3
4697 - }
4698 - },
4699 - "BaseReasoningSummaryPartDoneEvent": {
4700 - "type": "object",
4701 - "properties": {
4702 - "type": {
4703 - "type": "string",
4704 - "enum": [
4705 - "response.reasoning_summary_part.done"
4706 - ]
4707 - },
4708 - "output_index": {
4709 - "type": "integer"
4710 - },
4711 - "item_id": {
4712 - "type": "string"
4713 - },
4714 - "summary_index": {
4715 - "type": "integer"
4716 - },
4717 - "part": {
4718 - "$ref": "#/components/schemas/ReasoningSummaryText"
4719 - },
4720 - "sequence_number": {
4721 - "type": "integer"
4722 - }
4723 - },
4724 - "required": [
4725 - "type",
4726 - "output_index",
4727 - "item_id",
4728 - "summary_index",
4729 - "part",
4730 - "sequence_number"
4731 - ],
4732 - "description": "Event emitted when a reasoning summary part is complete",
4733 - "example": {
4734 - "type": "response.reasoning_summary_part.done",
4735 - "output_index": 0,
4736 - "item_id": "item-1",
4737 - "summary_index": 0,
4738 - "part": {
4739 - "type": "summary_text",
4740 - "text": "Analyzing the problem step by step to find the optimal solution."
4741 - },
4742 - "sequence_number": 7
4743 - }
4744 - },
4745 - "ReasoningSummaryPartDoneEvent": {
4746 - "allOf": [
4747 - {
4748 - "$ref": "#/components/schemas/BaseReasoningSummaryPartDoneEvent"
4749 - },
4750 - {
4751 - "type": "object",
4752 - "properties": {}
4753 - }
4754 - ],
4755 - "description": "Event emitted when a reasoning summary part is complete",
4756 - "example": {
4757 - "type": "response.reasoning_summary_part.done",
4758 - "output_index": 0,
4759 - "item_id": "item-1",
4760 - "summary_index": 0,
4761 - "part": {
4762 - "type": "summary_text",
4763 - "text": "Analyzing the problem step by step to find the optimal solution."
4764 - },
4765 - "sequence_number": 7
4766 - }
4767 - },
4768 - "BaseReasoningSummaryTextDeltaEvent": {
4769 - "type": "object",
4770 - "properties": {
4771 - "type": {
4772 - "type": "string",
4773 - "enum": [
4774 - "response.reasoning_summary_text.delta"
4775 - ]
4776 - },
4777 - "item_id": {
4778 - "type": "string"
4779 - },
4780 - "output_index": {
4781 - "type": "integer"
4782 - },
4783 - "summary_index": {
4784 - "type": "integer"
4785 - },
4786 - "delta": {
4787 - "type": "string"
4788 - },
4789 - "sequence_number": {
4790 - "type": "integer"
4791 - }
4792 - },
4793 - "required": [
4794 - "type",
4795 - "item_id",
4796 - "output_index",
4797 - "summary_index",
4798 - "delta",
4799 - "sequence_number"
4800 - ],
4801 - "description": "Event emitted when reasoning summary text delta is streamed",
4802 - "example": {
4803 - "type": "response.reasoning_summary_text.delta",
4804 - "item_id": "item-1",
4805 - "output_index": 0,
4806 - "summary_index": 0,
4807 - "delta": "Analyzing",
4808 - "sequence_number": 4
4809 - }
4810 - },
4811 - "ReasoningSummaryTextDeltaEvent": {
4812 - "allOf": [
4813 - {
4814 - "$ref": "#/components/schemas/BaseReasoningSummaryTextDeltaEvent"
4815 - },
4816 - {
4817 - "type": "object",
4818 - "properties": {}
4819 - }
4820 - ],
4821 - "description": "Event emitted when reasoning summary text delta is streamed",
4822 - "example": {
4823 - "type": "response.reasoning_summary_text.delta",
4824 - "item_id": "item-1",
4825 - "output_index": 0,
4826 - "summary_index": 0,
4827 - "delta": "Analyzing",
4828 - "sequence_number": 4
4829 - }
4830 - },
4831 - "BaseReasoningSummaryTextDoneEvent": {
4832 - "type": "object",
4833 - "properties": {
4834 - "type": {
4835 - "type": "string",
4836 - "enum": [
4837 - "response.reasoning_summary_text.done"
4838 - ]
4839 - },
4840 - "item_id": {
4841 - "type": "string"
4842 - },
4843 - "output_index": {
4844 - "type": "integer"
4845 - },
4846 - "summary_index": {
4847 - "type": "integer"
4848 - },
4849 - "text": {
4850 - "type": "string"
4851 - },
4852 - "sequence_number": {
4853 - "type": "integer"
4854 - }
4855 - },
4856 - "required": [
4857 - "type",
4858 - "item_id",
4859 - "output_index",
4860 - "summary_index",
4861 - "text",
4862 - "sequence_number"
4863 - ],
4864 - "description": "Event emitted when reasoning summary text streaming is complete",
4865 - "example": {
4866 - "type": "response.reasoning_summary_text.done",
4867 - "item_id": "item-1",
4868 - "output_index": 0,
4869 - "summary_index": 0,
4870 - "text": "Analyzing the problem step by step to find the optimal solution.",
4871 - "sequence_number": 6
4872 - }
4873 - },
4874 - "ReasoningSummaryTextDoneEvent": {
4875 - "allOf": [
4876 - {
4877 - "$ref": "#/components/schemas/BaseReasoningSummaryTextDoneEvent"
4878 - },
4879 - {
4880 - "type": "object",
4881 - "properties": {}
4882 - }
4883 - ],
4884 - "description": "Event emitted when reasoning summary text streaming is complete",
4885 - "example": {
4886 - "type": "response.reasoning_summary_text.done",
4887 - "item_id": "item-1",
4888 - "output_index": 0,
4889 - "summary_index": 0,
4890 - "text": "Analyzing the problem step by step to find the optimal solution.",
4891 - "sequence_number": 6
4892 - }
4893 - },
4894 - "OpenAIResponsesImageGenCallInProgress": {
4895 - "type": "object",
4896 - "properties": {
4897 - "type": {
4898 - "type": "string",
4899 - "enum": [
4900 - "response.image_generation_call.in_progress"
4901 - ]
4902 - },
4903 - "item_id": {
4904 - "type": "string"
4905 - },
4906 - "output_index": {
4907 - "type": "number"
4908 - },
4909 - "sequence_number": {
4910 - "type": "number"
4911 - }
4912 - },
4913 - "required": [
4914 - "type",
4915 - "item_id",
4916 - "output_index",
4917 - "sequence_number"
4918 - ]
4919 - },
4920 - "ImageGenCallInProgressEvent": {
4921 - "allOf": [
4922 - {
4923 - "$ref": "#/components/schemas/OpenAIResponsesImageGenCallInProgress"
4924 - },
4925 - {
4926 - "type": "object",
4927 - "properties": {}
4928 - }
4929 - ],
4930 - "description": "Image generation call in progress",
4931 - "example": {
4932 - "type": "response.image_generation_call.in_progress",
4933 - "output_index": 0,
4934 - "sequence_number": 1,
4935 - "item_id": "call-123"
4936 - }
4937 - },
4938 - "OpenAIResponsesImageGenCallGenerating": {
4939 - "type": "object",
4940 - "properties": {
4941 - "type": {
4942 - "type": "string",
4943 - "enum": [
4944 - "response.image_generation_call.generating"
4945 - ]
4946 - },
4947 - "item_id": {
4948 - "type": "string"
4949 - },
4950 - "output_index": {
4951 - "type": "number"
4952 - },
4953 - "sequence_number": {
4954 - "type": "number"
4955 - }
4956 - },
4957 - "required": [
4958 - "type",
4959 - "item_id",
4960 - "output_index",
4961 - "sequence_number"
4962 - ]
4963 - },
4964 - "ImageGenCallGeneratingEvent": {
4965 - "allOf": [
4966 - {
4967 - "$ref": "#/components/schemas/OpenAIResponsesImageGenCallGenerating"
4968 - },
4969 - {
4970 - "type": "object",
4971 - "properties": {}
4972 - }
4973 - ],
4974 - "description": "Image generation call is generating",
4975 - "example": {
4976 - "type": "response.image_generation_call.generating",
4977 - "output_index": 0,
4978 - "sequence_number": 2,
4979 - "item_id": "call-123"
4980 - }
4981 - },
4982 - "OpenAIResponsesImageGenCallPartialImage": {
4983 - "type": "object",
4984 - "properties": {
4985 - "type": {
4986 - "type": "string",
4987 - "enum": [
4988 - "response.image_generation_call.partial_image"
4989 - ]
4990 - },
4991 - "item_id": {
4992 - "type": "string"
4993 - },
4994 - "output_index": {
4995 - "type": "number"
4996 - },
4997 - "sequence_number": {
4998 - "type": "number"
4999 - },

This file is too large to show in full.

lib/app.dart
+6 -5
@@ -13,6 +13,7 @@ import 'package:localmind/features/servers/views/add_server_screen.dart';
13 import 'package:localmind/features/personas/views/persona_list_screen.dart';
14 import 'package:localmind/features/personas/views/create_persona_screen.dart';
15 import 'package:localmind/features/settings/screens/settings_screen.dart';
16 +import 'package:localmind/features/conversations/views/chat_history_screen.dart';
17 import 'package:localmind/features/onboarding/screens/onboarding_server_type_screen.dart';
18 import 'package:localmind/features/onboarding/screens/onboarding_server_setup_screen.dart';
19 import 'package:localmind/features/onboarding/screens/onboarding_theme_screen.dart';
@@ -72,11 +73,6 @@ final routerProvider = Provider<GoRouter>((ref) {
73 return AppShell(child: child);
74 },
75 routes: [
75 - GoRoute(
76 - path: AppRoutes.home,
77 - pageBuilder: (context, state) =>
78 - const NoTransitionPage(child: ChatScreen()),
79 - ),
76 GoRoute(
77 path: AppRoutes.home,
78 pageBuilder: (context, state) =>
@@ -113,6 +109,11 @@ final routerProvider = Provider<GoRouter>((ref) {
109 pageBuilder: (context, state) =>
110 const NoTransitionPage(child: SettingsScreen()),
111 ),
112 + GoRoute(
113 + path: AppRoutes.chatHistory,
114 + pageBuilder: (context, state) =>
115 + const NoTransitionPage(child: ChatHistoryScreen()),
116 + ),
117 ],
118 ),
119 ],
lib/core/routes/app_routes.dart
+1
@@ -9,5 +9,6 @@ class AppRoutes {
9 static const String createPersona = '/personas/create';
10 static const String settings = '/settings';
11 static const String models = '/models';
12 + static const String chatHistory = '/history';
13 }
14
lib/features/conversations/views/chat_history_screen.dart new
+74
@@ -0,0 +1,74 @@
1 +import 'package:flutter/material.dart';
2 +import 'package:flutter_riverpod/flutter_riverpod.dart';
3 +import 'package:localmind/features/conversations/providers/conversation_providers.dart';
4 +import 'components/conversation_list.dart';
5 +import 'components/conversation_empty_state.dart';
6 +import 'components/conversation_search_bar.dart';
7 +
8 +class ChatHistoryScreen extends ConsumerWidget {
9 + const ChatHistoryScreen({super.key});
10 +
11 + @override
12 + Widget build(BuildContext context, WidgetRef ref) {
13 + final theme = Theme.of(context);
14 + final isDark = theme.brightness == Brightness.dark;
15 +
16 + final groupedConversations = ref.watch(groupedConversationsProvider);
17 + final activeConversation = ref.watch(activeConversationProvider);
18 + final searchQuery = ref.watch(conversationSearchProvider);
19 +
20 + return SafeArea(
21 + child: Column(
22 + children: [
23 + // Header
24 + Container(
25 + padding: const EdgeInsets.only(left: 16, right: 16, bottom: 12),
26 + decoration: BoxDecoration(
27 + color: isDark ? const Color(0xFF0A0A0A) : const Color(0xFFFAFAFA),
28 + border: Border(
29 + bottom: BorderSide(
30 + color: isDark
31 + ? const Color(0xFF2A2A2A)
32 + : const Color(0xFFE5E5E5),
33 + ),
34 + ),
35 + ),
36 + child: Row(
37 + children: [
38 + Builder(
39 + builder: (context) => IconButton(
40 + icon: const Icon(Icons.menu),
41 + onPressed: () => Scaffold.of(context).openDrawer(),
42 + ),
43 + ),
44 + const SizedBox(width: 8),
45 + Text(
46 + 'Chat History',
47 + style: TextStyle(
48 + fontSize: 20,
49 + fontWeight: FontWeight.bold,
50 + color: isDark ? Colors.white : Colors.black,
51 + ),
52 + ),
53 + const Spacer(),
54 + ],
55 + ),
56 + ),
57 +
58 + // Search Bar
59 + const ConversationSearchBar(),
60 +
61 + // List
62 + Expanded(
63 + child: groupedConversations.isEmpty
64 + ? ConversationEmptyState(isSearching: searchQuery.isNotEmpty)
65 + : ConversationList(
66 + groupedConversations: groupedConversations,
67 + activeConversation: activeConversation,
68 + ),
69 + ),
70 + ],
71 + ),
72 + );
73 + }
74 +}
lib/features/servers/views/components/server_card.dart
+192 -112
@@ -54,132 +54,212 @@ class ServerCard extends StatelessWidget {
54 Widget build(BuildContext context) {
55 final theme = Theme.of(context);
56
57 - return Card(
58 - color: isActive
59 - ? theme.colorScheme.primaryContainer.withValues(alpha: 0.3)
60 - : null,
57 + final activeGreen = const Color(0xFF22C55E);
58 +
59 + return AnimatedContainer(
60 + duration: const Duration(milliseconds: 300),
61 + curve: Curves.easeInOut,
62 + decoration: BoxDecoration(
63 + color: isActive
64 + ? activeGreen.withValues(alpha: 0.08)
65 + : theme.cardColor,
66 + borderRadius: BorderRadius.circular(12),
67 + border: Border.all(
68 + color: isActive
69 + ? activeGreen.withValues(alpha: 0.5)
70 + : theme.dividerColor.withValues(alpha: 0.1),
71 + width: isActive ? 1.5 : 1,
72 + ),
73 + ),
74 + clipBehavior: Clip.antiAlias,
75 child: InkWell(
76 onTap: onTap,
63 - borderRadius: BorderRadius.circular(8),
64 - child: Padding(
65 - padding: const EdgeInsets.all(16),
66 - child: Row(
67 - children: [
68 - Container(
69 - width: 48,
70 - height: 48,
71 - decoration: BoxDecoration(
72 - // color: theme.colorScheme.primaryContainer,
73 - borderRadius: BorderRadius.circular(8),
77 + child: Stack(
78 + children: [
79 + if (isActive)
80 + Positioned(
81 + left: 0,
82 + top: 0,
83 + bottom: 0,
84 + width: 4,
85 + child: Container(
86 + decoration: BoxDecoration(
87 + color: activeGreen,
88 + borderRadius: const BorderRadius.only(
89 + topRight: Radius.circular(4),
90 + bottomRight: Radius.circular(4),
91 + ),
92 + ),
93 ),
75 - child: _serverIconData != null
76 - ? HugeIcon(
77 - icon: _serverIconData!.icon,
78 - size: 24,
79 - color: theme.colorScheme.primary,
80 - )
81 - : Icon(Icons.dns, color: theme.colorScheme.primary),
94 ),
83 - const SizedBox(width: 16),
84 - Expanded(
85 - child: Column(
86 - crossAxisAlignment: CrossAxisAlignment.start,
87 - children: [
88 - Row(
89 - children: [
90 - Expanded(
91 - child: Text(
92 - server.name,
93 - style: theme.textTheme.titleMedium?.copyWith(
94 - fontWeight: FontWeight.w600,
95 - ),
96 - overflow: TextOverflow.ellipsis,
95 + Padding(
96 + padding: const EdgeInsets.all(16),
97 + child: Row(
98 + children: [
99 + AnimatedContainer(
100 + duration: const Duration(milliseconds: 300),
101 + width: 48,
102 + height: 48,
103 + decoration: BoxDecoration(
104 + color: isActive
105 + ? activeGreen.withValues(alpha: 0.1)
106 + : theme.colorScheme.surfaceContainerHighest
107 + .withValues(alpha: 0.3),
108 + borderRadius: BorderRadius.circular(12),
109 + border: Border.all(
110 + color: isActive
111 + ? activeGreen.withValues(alpha: 0.2)
112 + : Colors.transparent,
113 + ),
114 + ),
115 + child: _serverIconData != null
116 + ? HugeIcon(
117 + icon: _serverIconData!.icon,
118 + size: 24,
119 + color: isActive
120 + ? activeGreen
121 + : theme.colorScheme.onSurfaceVariant,
122 + )
123 + : Icon(
124 + Icons.dns,
125 + color: isActive
126 + ? activeGreen
127 + : theme.colorScheme.onSurfaceVariant,
128 ),
98 - ),
99 - if (server.isDefault)
100 - Container(
101 - padding: const EdgeInsets.symmetric(
102 - horizontal: 8,
103 - vertical: 2,
104 - ),
105 - decoration: BoxDecoration(
106 - color: theme.colorScheme.primary,
107 - borderRadius: BorderRadius.circular(4),
108 - ),
109 - child: Text(
110 - 'Default',
111 - style: theme.textTheme.labelSmall?.copyWith(
112 - color: theme.colorScheme.onPrimary,
129 + ),
130 + const SizedBox(width: 16),
131 + Expanded(
132 + child: Column(
133 + crossAxisAlignment: CrossAxisAlignment.start,
134 + children: [
135 + Row(
136 + children: [
137 + Expanded(
138 + child: Text(
139 + server.name,
140 + style: theme.textTheme.titleMedium?.copyWith(
141 + fontWeight: FontWeight.w600,
142 + ),
143 + overflow: TextOverflow.ellipsis,
144 ),
145 ),
115 - ),
116 - ],
117 - ),
118 - const SizedBox(height: 4),
119 - Row(
120 - children: [
121 - Text(_serverTypeName, style: theme.textTheme.bodySmall),
122 - const SizedBox(width: 8),
123 - Text('•', style: theme.textTheme.bodySmall),
124 - const SizedBox(width: 8),
125 - Text(_serverAddress, style: theme.textTheme.bodySmall),
126 - ],
127 - ),
128 - ],
129 - ),
130 - ),
131 - const SizedBox(width: 12),
132 - ConnectionStatusIndicator(status: server.status),
133 - PopupMenuButton<String>(
134 - onSelected: (value) {
135 - switch (value) {
136 - case 'edit':
137 - onEdit?.call();
138 - break;
139 - case 'delete':
140 - onDelete?.call();
141 - break;
142 - case 'setDefault':
143 - onSetDefault?.call();
144 - break;
145 - }
146 - },
147 - itemBuilder: (context) => [
148 - const PopupMenuItem(
149 - value: 'edit',
150 - child: Row(
151 - children: [
152 - Icon(Icons.edit, size: 18),
153 - SizedBox(width: 8),
154 - Text('Edit'),
146 + if (isActive)
147 + Container(
148 + padding: const EdgeInsets.symmetric(
149 + horizontal: 8,
150 + vertical: 2,
151 + ),
152 + margin: const EdgeInsets.only(right: 4),
153 + decoration: BoxDecoration(
154 + color: activeGreen,
155 + borderRadius: BorderRadius.circular(4),
156 + ),
157 + child: Text(
158 + 'Active',
159 + style: theme.textTheme.labelSmall?.copyWith(
160 + color: Colors.white,
161 + fontWeight: FontWeight.bold,
162 + ),
163 + ),
164 + ),
165 + if (server.isDefault)
166 + Container(
167 + padding: const EdgeInsets.symmetric(
168 + horizontal: 8,
169 + vertical: 2,
170 + ),
171 + decoration: BoxDecoration(
172 + color: isActive
173 + ? activeGreen.withValues(alpha: 0.05)
174 + : theme.colorScheme.outline
175 + .withValues(alpha: 0.1),
176 + borderRadius: BorderRadius.circular(4),
177 + border: Border.all(
178 + color: isActive
179 + ? activeGreen.withValues(alpha: 0.3)
180 + : theme.colorScheme.outline,
181 + ),
182 + ),
183 + child: Text(
184 + 'Default',
185 + style: theme.textTheme.labelSmall?.copyWith(
186 + color: isActive
187 + ? activeGreen
188 + : theme.colorScheme.outline,
189 + ),
190 + ),
191 + ),
192 + ],
193 + ),
194 + const SizedBox(height: 4),
195 + Row(
196 + children: [
197 + Text(_serverTypeName,
198 + style: theme.textTheme.bodySmall),
199 + const SizedBox(width: 8),
200 + Text('•', style: theme.textTheme.bodySmall),
201 + const SizedBox(width: 8),
202 + Text(_serverAddress,
203 + style: theme.textTheme.bodySmall),
204 + ],
205 + ),
206 ],
207 ),
208 ),
158 - if (!server.isDefault)
159 - const PopupMenuItem(
160 - value: 'setDefault',
161 - child: Row(
162 - children: [
163 - Icon(Icons.star, size: 18),
164 - SizedBox(width: 8),
165 - Text('Set as Default'),
166 - ],
209 + const SizedBox(width: 12),
210 + ConnectionStatusIndicator(status: server.status),
211 + PopupMenuButton<String>(
212 + onSelected: (value) {
213 + switch (value) {
214 + case 'edit':
215 + onEdit?.call();
216 + break;
217 + case 'delete':
218 + onDelete?.call();
219 + break;
220 + case 'setDefault':
221 + onSetDefault?.call();
222 + break;
223 + }
224 + },
225 + itemBuilder: (context) => [
226 + const PopupMenuItem(
227 + value: 'edit',
228 + child: Row(
229 + children: [
230 + Icon(Icons.edit, size: 18),
231 + SizedBox(width: 8),
232 + Text('Edit'),
233 + ],
234 + ),
235 ),
168 - ),
169 - const PopupMenuItem(
170 - value: 'delete',
171 - child: Row(
172 - children: [
173 - Icon(Icons.delete, size: 18, color: Colors.red),
174 - SizedBox(width: 8),
175 - Text('Delete', style: TextStyle(color: Colors.red)),
176 - ],
177 - ),
236 + if (!server.isDefault)
237 + const PopupMenuItem(
238 + value: 'setDefault',
239 + child: Row(
240 + children: [
241 + Icon(Icons.star, size: 18),
242 + SizedBox(width: 8),
243 + Text('Set as Default'),
244 + ],
245 + ),
246 + ),
247 + const PopupMenuItem(
248 + value: 'delete',
249 + child: Row(
250 + children: [
251 + Icon(Icons.delete, size: 18, color: Colors.red),
252 + SizedBox(width: 8),
253 + Text('Delete', style: TextStyle(color: Colors.red)),
254 + ],
255 + ),
256 + ),
257 + ],
258 ),
259 ],
260 ),
181 - ],
182 - ),
261 + ),
262 + ],
263 ),
264 ),
265 );
lib/features/sidebar/components/conversation_drawer_header.dart
+2 -1
@@ -1,4 +1,5 @@
1 import 'package:flutter/material.dart';
2 +import 'package:go_router/go_router.dart';
3 import 'package:localmind/core/routes/app_routes.dart';
4
5 class ConversationDrawerHeader extends StatelessWidget {
@@ -45,7 +46,7 @@ class ConversationDrawerHeader extends StatelessWidget {
46 ),
47 onPressed: () {
48 Navigator.pop(context); // Close drawer
48 - Navigator.of(context).pushNamed(AppRoutes.settings);
49 + context.push(AppRoutes.settings);
50 },
51 ),
52 ],
lib/features/sidebar/sidebar_widget.dart
+5 -5
@@ -24,9 +24,9 @@ class SidebarWidget extends ConsumerWidget {
24 final searchQuery = ref.watch(conversationSearchProvider);
25
26 final location = GoRouterState.of(context).uri.toString();
27 - final isHome = location == AppRoutes.home || location.isEmpty;
27 final isServers = location.startsWith(AppRoutes.servers);
28 final isPersonas = location.startsWith(AppRoutes.personas);
29 + final isHistory = location.startsWith(AppRoutes.chatHistory);
30
31 return Container(
32 width: 300,
@@ -58,11 +58,11 @@ class SidebarWidget extends ConsumerWidget {
58 const ActiveServerIndicator(),
59 const SizedBox(height: 8),
60 DrawerNavItem(
61 - iconData: HugeIcons.strokeRoundedMessageMultiple01,
62 - label: 'Chat',
63 - isSelected: isHome,
61 + iconData: HugeIcons.strokeRoundedClock01,
62 + label: 'History',
63 + isSelected: isHistory,
64 onTap: () {
65 - context.go(AppRoutes.home);
65 + context.go(AppRoutes.chatHistory);
66 if (Scaffold.maybeOf(context)?.isDrawerOpen ?? false) {
67 Navigator.pop(context);
68 }
pubspec.yaml
+1 -1
@@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
16 # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
17 # In Windows, build-name is used as the major, minor, and patch parts
18 # of the product and file versions while build-number is used as the build suffix.
19 -version: 1.0.0+4
19 +version: 1.0.0+5
20
21 environment:
22 sdk: ^3.11.0