feat: return structured suggestion objects with display label and full prompt - #119

Open
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts
Open

feat: return structured suggestion objects with display label and full prompt#119
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts

Conversation

@Ridwannurudeen

Copy link
Copy Markdown

Summary

  • Suggestions now return {"display": "...", "prompt": "..."} objects instead of plain strings
  • display is the short 2-5 word button label shown in the UI
  • prompt is a full, detailed message sent to the agent when the button is clicked
  • Includes graceful fallback: legacy plain strings are returned as display=prompt

Motivation

The suggestion buttons currently show a short label (e.g. "Analyze ETH trend") and that same short string is what gets sent to the agent. A richer, more detailed prompt improves the quality of agent responses significantly. For example, clicking "Analyze ETH trend" now sends: "Analyze Ethereum's price trend over the past 30 days, including volume, momentum, and key support and resistance levels."

Changes

api/api_types.py

  • Add Suggestion dataclass with display: str and prompt: str

templates/suggestions.jinja2

  • Updated to generate JSON objects with both display and prompt fields
  • Added detailed example responses showing the expected format

server/fastapi_server.py

  • Import Suggestion from api_types
  • Update handle_suggestions_request return type from List[str] to List[Suggestion]
  • Parse structured objects from LLM response; fall back gracefully for plain strings

Test plan

  • Verify /api/v2/agent/suggestions returns {"suggestions": [{"display": "...", "prompt": "..."}, ...]}
  • Verify frontend receives display for button label and prompt as the message to send on click
  • Verify graceful fallback when LLM returns plain strings (display == prompt)

Closes#40

…l prompt
Suggestions endpoint now returns {"display": "...", "prompt": "..."} objects
instead of plain strings. The "display" field is the short 2-5 word button
label shown in the UI; the "prompt" field is a full, detailed message sent
to the agent when the user clicks the suggestion.
- Add Suggestion type to api/api_types.py (display + prompt fields)
- Update templates/suggestions.jinja2 to generate structured objects with
context-rich prompts alongside short display labels
- Update handle_suggestions_request to parse and return List[Suggestion]
- Gracefully falls back to display=prompt for any legacy plain string items
ClosesOpenGradient#40
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Just a friendly ping on this PR. It returns structured Suggestion objects (with display_label and full_prompt fields) instead of raw strings, making it easier for callers to render suggestions in UI without re-parsing. No breaking changes — happy to adjust anything if you have feedback.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this. Returns structured Suggestion objects (with display_label and full_prompt) instead of raw strings, making it straightforward for callers to render suggestions without re-parsing. No breaking changes. Happy to adjust anything.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make suggestion prompts longer

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: return structured suggestion objects with display label and full prompt - #119

Open
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts
Open

feat: return structured suggestion objects with display label and full prompt#119
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts

Conversation

@Ridwannurudeen

Copy link
Copy Markdown

Summary

  • Suggestions now return {"display": "...", "prompt": "..."} objects instead of plain strings
  • display is the short 2-5 word button label shown in the UI
  • prompt is a full, detailed message sent to the agent when the button is clicked
  • Includes graceful fallback: legacy plain strings are returned as display=prompt

Motivation

The suggestion buttons currently show a short label (e.g. "Analyze ETH trend") and that same short string is what gets sent to the agent. A richer, more detailed prompt improves the quality of agent responses significantly. For example, clicking "Analyze ETH trend" now sends: "Analyze Ethereum's price trend over the past 30 days, including volume, momentum, and key support and resistance levels."

Changes

api/api_types.py

  • Add Suggestion dataclass with display: str and prompt: str

templates/suggestions.jinja2

  • Updated to generate JSON objects with both display and prompt fields
  • Added detailed example responses showing the expected format

server/fastapi_server.py

  • Import Suggestion from api_types
  • Update handle_suggestions_request return type from List[str] to List[Suggestion]
  • Parse structured objects from LLM response; fall back gracefully for plain strings

Test plan

  • Verify /api/v2/agent/suggestions returns {"suggestions": [{"display": "...", "prompt": "..."}, ...]}
  • Verify frontend receives display for button label and prompt as the message to send on click
  • Verify graceful fallback when LLM returns plain strings (display == prompt)

Closes#40

…l prompt
Suggestions endpoint now returns {"display": "...", "prompt": "..."} objects
instead of plain strings. The "display" field is the short 2-5 word button
label shown in the UI; the "prompt" field is a full, detailed message sent
to the agent when the user clicks the suggestion.
- Add Suggestion type to api/api_types.py (display + prompt fields)
- Update templates/suggestions.jinja2 to generate structured objects with
context-rich prompts alongside short display labels
- Update handle_suggestions_request to parse and return List[Suggestion]
- Gracefully falls back to display=prompt for any legacy plain string items
ClosesOpenGradient#40
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Just a friendly ping on this PR. It returns structured Suggestion objects (with display_label and full_prompt fields) instead of raw strings, making it easier for callers to render suggestions in UI without re-parsing. No breaking changes — happy to adjust anything if you have feedback.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this. Returns structured Suggestion objects (with display_label and full_prompt) instead of raw strings, making it straightforward for callers to render suggestions without re-parsing. No breaking changes. Happy to adjust anything.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make suggestion prompts longer

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: return structured suggestion objects with display label and full prompt - #119

Open
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts
Open

feat: return structured suggestion objects with display label and full prompt#119
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts

Conversation

@Ridwannurudeen

Copy link
Copy Markdown

Summary

  • Suggestions now return {"display": "...", "prompt": "..."} objects instead of plain strings
  • display is the short 2-5 word button label shown in the UI
  • prompt is a full, detailed message sent to the agent when the button is clicked
  • Includes graceful fallback: legacy plain strings are returned as display=prompt

Motivation

The suggestion buttons currently show a short label (e.g. "Analyze ETH trend") and that same short string is what gets sent to the agent. A richer, more detailed prompt improves the quality of agent responses significantly. For example, clicking "Analyze ETH trend" now sends: "Analyze Ethereum's price trend over the past 30 days, including volume, momentum, and key support and resistance levels."

Changes

api/api_types.py

  • Add Suggestion dataclass with display: str and prompt: str

templates/suggestions.jinja2

  • Updated to generate JSON objects with both display and prompt fields
  • Added detailed example responses showing the expected format

server/fastapi_server.py

  • Import Suggestion from api_types
  • Update handle_suggestions_request return type from List[str] to List[Suggestion]
  • Parse structured objects from LLM response; fall back gracefully for plain strings

Test plan

  • Verify /api/v2/agent/suggestions returns {"suggestions": [{"display": "...", "prompt": "..."}, ...]}
  • Verify frontend receives display for button label and prompt as the message to send on click
  • Verify graceful fallback when LLM returns plain strings (display == prompt)

Closes#40

…l prompt
Suggestions endpoint now returns {"display": "...", "prompt": "..."} objects
instead of plain strings. The "display" field is the short 2-5 word button
label shown in the UI; the "prompt" field is a full, detailed message sent
to the agent when the user clicks the suggestion.
- Add Suggestion type to api/api_types.py (display + prompt fields)
- Update templates/suggestions.jinja2 to generate structured objects with
context-rich prompts alongside short display labels
- Update handle_suggestions_request to parse and return List[Suggestion]
- Gracefully falls back to display=prompt for any legacy plain string items
ClosesOpenGradient#40
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Just a friendly ping on this PR. It returns structured Suggestion objects (with display_label and full_prompt fields) instead of raw strings, making it easier for callers to render suggestions in UI without re-parsing. No breaking changes — happy to adjust anything if you have feedback.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this. Returns structured Suggestion objects (with display_label and full_prompt) instead of raw strings, making it straightforward for callers to render suggestions without re-parsing. No breaking changes. Happy to adjust anything.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make suggestion prompts longer

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: return structured suggestion objects with display label and full prompt - #119

Open
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts
Open

feat: return structured suggestion objects with display label and full prompt#119
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts

Conversation

@Ridwannurudeen

Copy link
Copy Markdown

Summary

  • Suggestions now return {"display": "...", "prompt": "..."} objects instead of plain strings
  • display is the short 2-5 word button label shown in the UI
  • prompt is a full, detailed message sent to the agent when the button is clicked
  • Includes graceful fallback: legacy plain strings are returned as display=prompt

Motivation

The suggestion buttons currently show a short label (e.g. "Analyze ETH trend") and that same short string is what gets sent to the agent. A richer, more detailed prompt improves the quality of agent responses significantly. For example, clicking "Analyze ETH trend" now sends: "Analyze Ethereum's price trend over the past 30 days, including volume, momentum, and key support and resistance levels."

Changes

api/api_types.py

  • Add Suggestion dataclass with display: str and prompt: str

templates/suggestions.jinja2

  • Updated to generate JSON objects with both display and prompt fields
  • Added detailed example responses showing the expected format

server/fastapi_server.py

  • Import Suggestion from api_types
  • Update handle_suggestions_request return type from List[str] to List[Suggestion]
  • Parse structured objects from LLM response; fall back gracefully for plain strings

Test plan

  • Verify /api/v2/agent/suggestions returns {"suggestions": [{"display": "...", "prompt": "..."}, ...]}
  • Verify frontend receives display for button label and prompt as the message to send on click
  • Verify graceful fallback when LLM returns plain strings (display == prompt)

Closes#40

…l prompt
Suggestions endpoint now returns {"display": "...", "prompt": "..."} objects
instead of plain strings. The "display" field is the short 2-5 word button
label shown in the UI; the "prompt" field is a full, detailed message sent
to the agent when the user clicks the suggestion.
- Add Suggestion type to api/api_types.py (display + prompt fields)
- Update templates/suggestions.jinja2 to generate structured objects with
context-rich prompts alongside short display labels
- Update handle_suggestions_request to parse and return List[Suggestion]
- Gracefully falls back to display=prompt for any legacy plain string items
ClosesOpenGradient#40
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Just a friendly ping on this PR. It returns structured Suggestion objects (with display_label and full_prompt fields) instead of raw strings, making it easier for callers to render suggestions in UI without re-parsing. No breaking changes — happy to adjust anything if you have feedback.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this. Returns structured Suggestion objects (with display_label and full_prompt) instead of raw strings, making it straightforward for callers to render suggestions without re-parsing. No breaking changes. Happy to adjust anything.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make suggestion prompts longer

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: return structured suggestion objects with display label and full prompt - #119

Open
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts
Open

feat: return structured suggestion objects with display label and full prompt#119
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts

Conversation

@Ridwannurudeen

Copy link
Copy Markdown

Summary

  • Suggestions now return {"display": "...", "prompt": "..."} objects instead of plain strings
  • display is the short 2-5 word button label shown in the UI
  • prompt is a full, detailed message sent to the agent when the button is clicked
  • Includes graceful fallback: legacy plain strings are returned as display=prompt

Motivation

The suggestion buttons currently show a short label (e.g. "Analyze ETH trend") and that same short string is what gets sent to the agent. A richer, more detailed prompt improves the quality of agent responses significantly. For example, clicking "Analyze ETH trend" now sends: "Analyze Ethereum's price trend over the past 30 days, including volume, momentum, and key support and resistance levels."

Changes

api/api_types.py

  • Add Suggestion dataclass with display: str and prompt: str

templates/suggestions.jinja2

  • Updated to generate JSON objects with both display and prompt fields
  • Added detailed example responses showing the expected format

server/fastapi_server.py

  • Import Suggestion from api_types
  • Update handle_suggestions_request return type from List[str] to List[Suggestion]
  • Parse structured objects from LLM response; fall back gracefully for plain strings

Test plan

  • Verify /api/v2/agent/suggestions returns {"suggestions": [{"display": "...", "prompt": "..."}, ...]}
  • Verify frontend receives display for button label and prompt as the message to send on click
  • Verify graceful fallback when LLM returns plain strings (display == prompt)

Closes#40

…l prompt
Suggestions endpoint now returns {"display": "...", "prompt": "..."} objects
instead of plain strings. The "display" field is the short 2-5 word button
label shown in the UI; the "prompt" field is a full, detailed message sent
to the agent when the user clicks the suggestion.
- Add Suggestion type to api/api_types.py (display + prompt fields)
- Update templates/suggestions.jinja2 to generate structured objects with
context-rich prompts alongside short display labels
- Update handle_suggestions_request to parse and return List[Suggestion]
- Gracefully falls back to display=prompt for any legacy plain string items
ClosesOpenGradient#40
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Just a friendly ping on this PR. It returns structured Suggestion objects (with display_label and full_prompt fields) instead of raw strings, making it easier for callers to render suggestions in UI without re-parsing. No breaking changes — happy to adjust anything if you have feedback.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this. Returns structured Suggestion objects (with display_label and full_prompt) instead of raw strings, making it straightforward for callers to render suggestions without re-parsing. No breaking changes. Happy to adjust anything.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make suggestion prompts longer

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: return structured suggestion objects with display label and full prompt - #119

Open
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts
Open

feat: return structured suggestion objects with display label and full prompt#119
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts

Conversation

@Ridwannurudeen

Copy link
Copy Markdown

Summary

  • Suggestions now return {"display": "...", "prompt": "..."} objects instead of plain strings
  • display is the short 2-5 word button label shown in the UI
  • prompt is a full, detailed message sent to the agent when the button is clicked
  • Includes graceful fallback: legacy plain strings are returned as display=prompt

Motivation

The suggestion buttons currently show a short label (e.g. "Analyze ETH trend") and that same short string is what gets sent to the agent. A richer, more detailed prompt improves the quality of agent responses significantly. For example, clicking "Analyze ETH trend" now sends: "Analyze Ethereum's price trend over the past 30 days, including volume, momentum, and key support and resistance levels."

Changes

api/api_types.py

  • Add Suggestion dataclass with display: str and prompt: str

templates/suggestions.jinja2

  • Updated to generate JSON objects with both display and prompt fields
  • Added detailed example responses showing the expected format

server/fastapi_server.py

  • Import Suggestion from api_types
  • Update handle_suggestions_request return type from List[str] to List[Suggestion]
  • Parse structured objects from LLM response; fall back gracefully for plain strings

Test plan

  • Verify /api/v2/agent/suggestions returns {"suggestions": [{"display": "...", "prompt": "..."}, ...]}
  • Verify frontend receives display for button label and prompt as the message to send on click
  • Verify graceful fallback when LLM returns plain strings (display == prompt)

Closes#40

…l prompt
Suggestions endpoint now returns {"display": "...", "prompt": "..."} objects
instead of plain strings. The "display" field is the short 2-5 word button
label shown in the UI; the "prompt" field is a full, detailed message sent
to the agent when the user clicks the suggestion.
- Add Suggestion type to api/api_types.py (display + prompt fields)
- Update templates/suggestions.jinja2 to generate structured objects with
context-rich prompts alongside short display labels
- Update handle_suggestions_request to parse and return List[Suggestion]
- Gracefully falls back to display=prompt for any legacy plain string items
ClosesOpenGradient#40
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Just a friendly ping on this PR. It returns structured Suggestion objects (with display_label and full_prompt fields) instead of raw strings, making it easier for callers to render suggestions in UI without re-parsing. No breaking changes — happy to adjust anything if you have feedback.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this. Returns structured Suggestion objects (with display_label and full_prompt) instead of raw strings, making it straightforward for callers to render suggestions without re-parsing. No breaking changes. Happy to adjust anything.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make suggestion prompts longer

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: return structured suggestion objects with display label and full prompt - #119

Open
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts
Open

feat: return structured suggestion objects with display label and full prompt#119
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts

Conversation

@Ridwannurudeen

Copy link
Copy Markdown

Summary

  • Suggestions now return {"display": "...", "prompt": "..."} objects instead of plain strings
  • display is the short 2-5 word button label shown in the UI
  • prompt is a full, detailed message sent to the agent when the button is clicked
  • Includes graceful fallback: legacy plain strings are returned as display=prompt

Motivation

The suggestion buttons currently show a short label (e.g. "Analyze ETH trend") and that same short string is what gets sent to the agent. A richer, more detailed prompt improves the quality of agent responses significantly. For example, clicking "Analyze ETH trend" now sends: "Analyze Ethereum's price trend over the past 30 days, including volume, momentum, and key support and resistance levels."

Changes

api/api_types.py

  • Add Suggestion dataclass with display: str and prompt: str

templates/suggestions.jinja2

  • Updated to generate JSON objects with both display and prompt fields
  • Added detailed example responses showing the expected format

server/fastapi_server.py

  • Import Suggestion from api_types
  • Update handle_suggestions_request return type from List[str] to List[Suggestion]
  • Parse structured objects from LLM response; fall back gracefully for plain strings

Test plan

  • Verify /api/v2/agent/suggestions returns {"suggestions": [{"display": "...", "prompt": "..."}, ...]}
  • Verify frontend receives display for button label and prompt as the message to send on click
  • Verify graceful fallback when LLM returns plain strings (display == prompt)

Closes#40

…l prompt
Suggestions endpoint now returns {"display": "...", "prompt": "..."} objects
instead of plain strings. The "display" field is the short 2-5 word button
label shown in the UI; the "prompt" field is a full, detailed message sent
to the agent when the user clicks the suggestion.
- Add Suggestion type to api/api_types.py (display + prompt fields)
- Update templates/suggestions.jinja2 to generate structured objects with
context-rich prompts alongside short display labels
- Update handle_suggestions_request to parse and return List[Suggestion]
- Gracefully falls back to display=prompt for any legacy plain string items
ClosesOpenGradient#40
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Just a friendly ping on this PR. It returns structured Suggestion objects (with display_label and full_prompt fields) instead of raw strings, making it easier for callers to render suggestions in UI without re-parsing. No breaking changes — happy to adjust anything if you have feedback.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this. Returns structured Suggestion objects (with display_label and full_prompt) instead of raw strings, making it straightforward for callers to render suggestions without re-parsing. No breaking changes. Happy to adjust anything.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make suggestion prompts longer

1 participant

@Ridwannurudeen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: return structured suggestion objects with display label and full prompt - #119

Open
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts
Open

feat: return structured suggestion objects with display label and full prompt#119
Ridwannurudeen wants to merge 1 commit into
OpenGradient:mainfrom
Ridwannurudeen:feat/suggestion-prompts

Conversation

@Ridwannurudeen

Copy link
Copy Markdown

Summary

  • Suggestions now return {"display": "...", "prompt": "..."} objects instead of plain strings
  • display is the short 2-5 word button label shown in the UI
  • prompt is a full, detailed message sent to the agent when the button is clicked
  • Includes graceful fallback: legacy plain strings are returned as display=prompt

Motivation

The suggestion buttons currently show a short label (e.g. "Analyze ETH trend") and that same short string is what gets sent to the agent. A richer, more detailed prompt improves the quality of agent responses significantly. For example, clicking "Analyze ETH trend" now sends: "Analyze Ethereum's price trend over the past 30 days, including volume, momentum, and key support and resistance levels."

Changes

api/api_types.py

  • Add Suggestion dataclass with display: str and prompt: str

templates/suggestions.jinja2

  • Updated to generate JSON objects with both display and prompt fields
  • Added detailed example responses showing the expected format

server/fastapi_server.py

  • Import Suggestion from api_types
  • Update handle_suggestions_request return type from List[str] to List[Suggestion]
  • Parse structured objects from LLM response; fall back gracefully for plain strings

Test plan

  • Verify /api/v2/agent/suggestions returns {"suggestions": [{"display": "...", "prompt": "..."}, ...]}
  • Verify frontend receives display for button label and prompt as the message to send on click
  • Verify graceful fallback when LLM returns plain strings (display == prompt)

Closes#40

…l prompt
Suggestions endpoint now returns {"display": "...", "prompt": "..."} objects
instead of plain strings. The "display" field is the short 2-5 word button
label shown in the UI; the "prompt" field is a full, detailed message sent
to the agent when the user clicks the suggestion.
- Add Suggestion type to api/api_types.py (display + prompt fields)
- Update templates/suggestions.jinja2 to generate structured objects with
context-rich prompts alongside short display labels
- Update handle_suggestions_request to parse and return List[Suggestion]
- Gracefully falls back to display=prompt for any legacy plain string items
ClosesOpenGradient#40
@Ridwannurudeen

Copy link
Copy Markdown
Author

Hi team! Just a friendly ping on this PR. It returns structured Suggestion objects (with display_label and full_prompt fields) instead of raw strings, making it easier for callers to render suggestions in UI without re-parsing. No breaking changes — happy to adjust anything if you have feedback.

@Ridwannurudeen

Copy link
Copy Markdown
Author

Hey team — following up on this. Returns structured Suggestion objects (with display_label and full_prompt) instead of raw strings, making it straightforward for callers to render suggestions without re-parsing. No breaking changes. Happy to adjust anything.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make suggestion prompts longer

1 participant

@Ridwannurudeen