Repository navigation
improvement(landing): search-length titles, model comparison pages, and free model tools - #9184
waleedlatif1 wants to merge 8 commits into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
There was a problem hiding this comment.
All reported issues were addressed across 18 files
Reply with feedback, questions, or to request a fix.
Turn on auto-fix | Re-trigger cubic
[Medium impact] The PR appears safe to merge; no new actionable issues remain. SummaryThe PR adds shorter search titles, model comparison pages, a pricing calculator, and a browser-only token counter.
|
9074dc0 to
4828f1a
Compare
|
@greptile |
|
@cubic-dev-ai review this PR |
@waleedlatif1 I have started the AI code review. It will take a few minutes to complete. |
There was a problem hiding this comment.
All reported issues were addressed across 141 files
Reply with feedback, questions, or to request a fix.
Turn on auto-fix | Re-trigger cubic
…fit search results - Optional seoTitle/seoDescription frontmatter drive <title>, meta description, and Open Graph/X copy; the H1, cards, feeds, and JSON-LD keep title/description - check:library-content ratchets search title (with the " | Sim" suffix) to 60 characters and description to 160, with a shrink-only baseline - Rewrite search titles and descriptions for 12 library pages to match the queries they rank for - Author pages no longer render the brand twice in their title
…ict check - Drop the baseline so parallel content PRs never conflict on it; every published post now fits - Add search titles and descriptions to the remaining library, blog, and changelog posts
- /models/pricing-calculator prices requests and monthly volume per model with the same tier and cached-input rules billing uses (priceTokenUsage, extracted unchanged from the billing cost policy) - /models/token-counter counts tokens in the browser: exact for OpenAI encodings (js-tiktoken loaded on first input), labelled estimates for other providers; pasted text never leaves the page - Both pages link from /models and appear in the sitemap and llms.txt
…nd model-vs-model pages
- Provider pages target API pricing searches ("Anthropic (Claude) API Pricing & Models")
- /models/context-windows compares context window, max output, and price for every current model; retired models are excluded
- 47 curated /models/compare pages with a data-derived verdict priced at standard per-call rates; the build fails if a curated model is retired or removed
…checks - Model page chip links use ChipLink's outline variant instead of restyling it - ComparisonLinks gets its own component folder - One E2E check covers every model page's search title budget and canonical; a fixture test covers the search length rules
…e structure - Context windows, the pricing tools, and comparisons skip evaluation-only models (native state and questions, not prompts) - Token counter labels an OpenAI count as an estimate when exact encoding fails - New model pages: desktop-first breakpoints, named props interfaces, section ids and labels, sr-only hero summaries; TSDoc on exported comparison helpers
4828f1a to
3c1ffd1
Compare
|
@greptile |
|
@cubic-dev-ai review this PR |
@waleedlatif1 I have started the AI code review. It will take a few minutes to complete. |
There was a problem hiding this comment.
All reported issues were addressed across 141 files
Reply with feedback, questions, or to request a fix.
Turn on auto-fix | Re-trigger cubic
|
@greptile |
|
@cubic-dev-ai review this PR |
@waleedlatif1 I have started the AI code review. It will take a few minutes to complete. |
There was a problem hiding this comment.
1 issue found across 141 files
Confidence score: 4/5
- In
apps/sim/app/(landing)/models/utils.ts,getLargestContextProviderModelcan select an evaluation model, causing the provider FAQ to namejev-latestas the largest-context model. Exclude evaluation models from this selection.
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="apps/sim/app/(landing)/models/utils.ts">
<violation number="1" location="apps/sim/app/(landing)/models/utils.ts:895">
P2: `getLargestContextProviderModel` can select an evaluation model. The TypeSafe `jev-*` models have `capabilities.evaluation` and a 64k window, so the provider FAQ names `jev-latest` as the largest-context model. The context-windows page excludes evaluation models, so the FAQ contradicts the ranking its docstring says it matches. Filter with `isPromptModel` here.
(Based on your team's feedback about excluding evaluation models from context-window rankings.)</violation>
</file>
Reply with feedback, questions, or to request a fix.
Turn on auto-fix | Re-trigger cubic
| * by {@link compareByContextWindow} so provider FAQs agree with the context-window comparison. | ||
| */ | ||
| function getLargestContextProviderModel(provider: CatalogProvider): CatalogModel | null { | ||
| const candidates = provider.models.filter((model) => !model.retired && model.contextWindow) |
There was a problem hiding this comment.
P2: getLargestContextProviderModel can select an evaluation model. The TypeSafe jev-* models have capabilities.evaluation and a 64k window, so the provider FAQ names jev-latest as the largest-context model. The context-windows page excludes evaluation models, so the FAQ contradicts the ranking its docstring says it matches. Filter with isPromptModel here.
(Based on your team's feedback about excluding evaluation models from context-window rankings.)
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At apps/sim/app/(landing)/models/utils.ts, line 895:
<comment>`getLargestContextProviderModel` can select an evaluation model. The TypeSafe `jev-*` models have `capabilities.evaluation` and a 64k window, so the provider FAQ names `jev-latest` as the largest-context model. The context-windows page excludes evaluation models, so the FAQ contradicts the ranking its docstring says it matches. Filter with `isPromptModel` here.
(Based on your team's feedback about excluding evaluation models from context-window rankings.) </comment>
<file context>
@@ -828,9 +874,55 @@ export function getCheapestProviderModel(provider: CatalogProvider): CatalogMode
+ * by {@link compareByContextWindow} so provider FAQs agree with the context-window comparison.
+ */
+function getLargestContextProviderModel(provider: CatalogProvider): CatalogModel | null {
+ const candidates = provider.models.filter((model) => !model.retired && model.contextWindow)
+ if (candidates.length === 0) return null
+ return candidates.reduce((best, model) =>
</file context>
| const candidates = provider.models.filter((model) => !model.retired && model.contextWindow) | |
| const candidates = provider.models.filter( | |
| (model) => isPromptModel(model) && !model.retired && model.contextWindow | |
| ) |
Summary
Landing SEO work, folded into one PR:
Library search titles
titlefor the H1,<title>, Open Graph and JSON-LD; with the " | Sim" suffix most library titles ran past 60 characters and were truncated in search resultsseoTitle/seoDescriptionfrontmatter now drive<title>, the meta description and Open Graph/X copy; the H1, cards, feeds and JSON-LD keeptitle/descriptioncheck:library-contentenforces the search title (suffix included) at 60 characters and the search description at 160 for every published post. No baseline, so parallel content PRs never conflict on oneModel catalog
/models/context-windowscompares context window, max output and price for every current model; retired models are excluded/models/compare/[pair]pages with a data-derived verdict priced at standard per-call rates throughresolveModelTokenPricing; the build fails if a curated model is retired or removedFree tools
/models/pricing-calculatorprices requests and monthly volume per model with the exact tier and cached-input rules billing uses: the priced branch ofpriceModelUsagemoved unchanged into a client-safepriceTokenUsage/models/token-countercounts tokens in the browser: exact for OpenAI encodings (js-tiktoken loads on first input, one encode per encoding), labelled estimates for other providers; pasted text never leaves the pageType of Change
Testing
check:library-contentpasses (129 posts). New fixture test for the search length rules fails when the suffix is dropped from the count, when>becomes>=, and when drafts stop being exempttest-landing-seo-e2e.ts: libraryseoTitle/seoDescriptionserved in<title>,og:titleand meta description with the H1 unchanged; every model page (including all compare pages in the sitemap) has a unique title ≤60 characters with one " | Sim" and a self canonical; unknown compare pairs 404; the token counter's initial HTML and scripts contain no js-tiktoken codeproviders/pricing,cost-policy,lib/tokenization, provider usage tests; billing extraction verified line by line as unchangedcheck:file-names,check:source-conventions,check:comment-hygiene,check:client-boundary,check:utils,check:unused-exports, biomeChecklist
test-auditauthoring gate)