Skip to content

feat(mcp-server): migrate prediction market-data REST endpoints + settlement alert fetcher to SDK (PREDICT-8820) - #67

Merged
SohumDesai27 merged 4 commits into
mainfrom
predict-8820-migrate-prediction-market-data-rest-endpoints-settlement
Sep 21, 2026
Merged

SohumDesai27 merged 4 commits into
mainfrom
predict-8820-migrate-prediction-market-data-rest-endpoints-settlement

Conversation

@SohumDesai27

@SohumDesai27 SohumDesai27 commented Sep 21, 2026 •

Copy link
Copy Markdown
Collaborator

Linear Board: https://linear.app/gemini/issue/PREDICT-8820/migrate-prediction-market-data-rest-endpoints-settlement-alert-fetcher

What's Included

Migrated all 8 market-data endpoints in datasources/predictions/market-data.ts from the hand-rolled GeminiHttpClient to @gemini-markets/sdk's client.predictions.* operations: listEvents, getEvent, getEventStrike, listNewlyListedEvents, listRecentlySettledEvents, listUpcomingEvents, getCategories, getVolumeMetrics. Return types are unchanged (existing hand-verified-against-production shapes in types/predictions.ts) — the SDK's OpenAPI-generated response types are a superset, so results are cast through rather than re-typed, keeping every downstream consumer's contract identical.

Settlement fields normalized explicitly: the SDK's generated Event schema places settlement data at settlement.value/resolvedAt, not the flat settlementValue/settlementTime fields PredictionEvent and the settlement-alert fetcher expect. Added a normalizeEvent/normalizeEvents helper that maps these explicitly (preferring an already-flat field if the API ever sends one directly), applied to every function that returns event(s).

getVolumeMetrics account scoping preserved: this is the one authenticated call among the 8. The legacy client's authenticatedPost unconditionally injected config.account into the body for sub-account scoping; the SDK has no first-class account field, but its body builder forwards any extra input key straight through, so the same injection is replicated explicitly in the datasource function.

Wired the dead sdkClient param from PREDICT-8816: server.ts now actually passes sdkClient into createPredictionMarketDataTools (previously accepted but unused). tools/predictions/market-data.ts's factory signature updated to SdkClient.

Settlement alert fetcher migrated for free, per the ticket's scope: alerts/daemon/index.ts's buildFetchers now takes sdkClient alongside the legacy client, and predictionsSettled calls the migrated listRecentlySettled(sdkClient).

config.ts's sdkEnv now derives from GEMINI_API_BASE_URL by default, instead of hardcoding production, so setting only the documented base-URL var routes prediction-market SDK calls to the same environment as everything else. GEMINI_SDK_ENV still works as an explicit override, and is now included in the alert supervisor's ENV_WHITELIST so that override survives daemon install (it was silently dropped before — inert prior to this PR, now load-bearing since the daemon consumes sdkClient).

Testing

  • npm test — 311/311 passing, 0 regressions (includes new coverage added while addressing automated review feedback: settlement-field normalization, list-option forwarding, sdkEnv derivation across sandbox/production/override paths, and the supervisor env-whitelist fix)
  • npm run typecheck — clean
  • npm run build — clean
  • New/updated unit tests in market-data.test.ts (rewrote the mock harness to fake SdkClient.predictions instead of GeminiHttpClient):
    • Ported all 5 existing PREDICT-8871 regression tests (plain, unbracketed category/status keys) — now asserting against the SDK input object rather than raw query params
    • Added missing coverage for getEvent, getEventStrike, getVolumeMetrics (previously untested)
    • Added coverage for the config.account injection on getVolumeMetrics, both with and without an account configured
    • Added coverage for settlement-field normalization (nested mapping, flat-field preference, no-settlement-data case) and search/limit/offset forwarding on the list endpoints
  • Fixed tools/annotations.test.ts, which independently rebuilds allTools to regression-test the destructive/write tool lists — needed a second fake client typed SdkClient for the market-data factory
  • Added config.test.ts/config.override.test.ts covering resolveSdkEnv's derivation across sandbox/production base URLs, unset/empty/explicit overrides, and the module-load wiring itself
  • Added pickWhitelistedEnv/ENV_WHITELIST coverage for the GEMINI_SDK_ENV supervisor fix
  • Verified the alert scheduler's own tests still pass unaffected (no test imports buildFetchers directly)

Manual, against real production only — sandbox not yet exercised (fresh gemini MCP session, since MCP servers don't hot-reload):

  • gemini_get_prediction_volume_metrics — authenticated SDK call confirmed working end-to-end against a real event (CFBPLAYOFF2627, College Football Playoff Qualifiers), 50 contracts returned. Confirms the HMAC-auth path through the SDK works for the one authenticated endpoint here.
  • gemini_list_recently_settled_prediction_events — confirmed against a real settled event (SOL05M2609211705, production): raw JSON has flat, top-level settlementValue/settlementTime, both correctly populated. (Interesting note: production sends these flat, not nested under settlement.value/resolvedAt as the SDK's generated OpenAPI schema implied — the schema-drift risk didn't materialize here, but normalizeEvent's flat-field-preference design means it's a safe no-op in this case and would have been the actual fix if it had.)
  • gemini_list_prediction_events / gemini_get_prediction_event / gemini_get_prediction_event_strike / gemini_list_upcoming_prediction_events / gemini_list_newly_listed_prediction_events / gemini_list_prediction_categories — spot-checked via CFBPLAYOFF2627 (event details, category, upcoming/newly-listed membership) and via category+search+limit filtering (active crypto events, upcoming sports search). getEventStrike correctly 404s for this multi-outcome event (no single reference strike) and propagates cleanly through wrapHandler rather than crashing.
  • Settlement alert path end-to-end — created a prediction.settled rule against a real, freshly-settled event (SOL05M2609211705), ran the daemon binary directly in the foreground (not installed as a persistent service) to trigger its immediate first-poll evaluation. Confirmed via gemini_alert_history/gemini_alert_get: fired with reason "Prediction event SOL05M2609211705 settled at 117.35199999999999", lastFiredAt set, rule auto-disabled (oneShot: true). (Hit an unrelated local node-notifier/macOS Notification Center spawn error — errno -86 trying to exec its bundled helper binary — but Scheduler.dispatch catches that and still persists the fire/history regardless, so it didn't block verification. Nothing in this PR touches the notifier.)
  • Sandbox — intentionally not verified separately; production-only manual testing was deemed sufficient for this PR
Screenshot 2026-09-21 at 1 18 12 PM Screenshot 2026-09-21 at 1 19 00 PM Screenshot 2026-09-21 at 1 25 35 PM

(Spot Check)
Screenshot 2026-09-21 at 1 19 27 PM

What Success Looks Like

A reviewer should be able to call any of the 8 gemini_*_prediction_* market-data tools against sandbox or production and get back the same shape of data as before this PR — same field names, same values — just served through the SDK client instead of the legacy HTTP client. A false negative here looks like: a field silently going missing or undefined in the response (most likely settlementValue/settlementTime on settled events — now normalized and unit-tested, but still worth a live check per above), or an authenticated call to getVolumeMetrics failing where it used to succeed. No regression to existing tools — orders, positions, and combos still run through the legacy GeminiHttpClient untouched, and spot/margin/staking/fund tools are unaffected.

🤖 Generated with Claude Code

…tlement alert fetcher to SDK (PREDICT-8820)

Routes the 8 public prediction market-data endpoints and the settlement-alert
daemon fetcher through @gemini-markets/sdk's client.predictions.* operations,
replacing the hand-rolled GeminiHttpClient for these paths. Wires the
already-plumbed-but-unused sdkClient param from PREDICT-8816 into
createPredictionMarketDataTools and the alerts daemon's buildFetchers.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@linear-code

linear-code Bot commented Sep 21, 2026

Copy link
Copy Markdown

PREDICT-8820

@nostradamus-bot

Copy link
Copy Markdown

Nostradamus Risk Rating — Medium

The PR migrates 8 prediction market-data endpoints from GeminiHttpClient to @gemini-markets/sdk across datasources/predictions/market-data.ts and alerts/daemon/index.ts — both High-sensitivity components — but the change is a client-substitution refactor with no new endpoints or attack surface; the principal risk is a behavioral nuance in getVolumeMetrics's sub-account injection (config.account is now conditionally vs. always sent) and an open PR-author-flagged risk of settlementValue/settlementTime field-shape drift silently breaking settlement alerts.

@svc-grace svc-grace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agentic Review

Neat migration overall, but two correctness issues need attention before this can move forward: the prediction tools currently bypass the configured API base URL, and the SDK settlement response needs to be mapped back to the legacy event shape so settled alerts don't silently lose fields. There's also a small coverage gap around forwarding list options; worth adding, but it isn't blocking.

Review process

Grace version: v0.0.210
Files reviewed (6): annotations.test.ts, index.ts, market-data.test.ts, market-data.ts, server.ts
Guidelines: none discovered
Verification: 3 of 6 findings verified
Findings: 0 critical, 2 important, 1 suggestion
Linked tickets: PREDICT-8820
LLM usage: 119 calls — gpt-5.6-luna: 78 calls, 4398262 tokens, us.anthropic.claude-opus-4-6-v1: 34 calls, 844421 tokens, us.anthropic.claude-sonnet-4-6: 7 calls, 743186 tokens

...createMarginTools(client),
...createStakingTools(client),
...createPredictionMarketDataTools(client),
...createPredictionMarketDataTools(sdkClient),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Important: Prediction tools bypass the configured API base URL

This wiring makes prediction tools ignore the documented GEMINI_API_BASE_URL setting because sdkClient selects only config.sdkEnv, while the legacy client used config.baseUrl. When an operator sets the documented sandbox URL without also setting GEMINI_SDK_ENV=sandbox, all eight prediction calls go to production instead of the requested endpoint. Configure the SDK from the existing base-URL setting or update the config contract and migration path so the two selectors cannot diverge.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7a73521 — resolveSdkEnv() in config.ts now derives the default from GEMINI_API_BASE_URL (sandbox hostname → sandbox) instead of hardcoding production, so setting only the documented base-URL var routes prediction-market SDK calls to the same environment as everything else. GEMINI_SDK_ENV still works as an explicit override for the rare case someone wants them to diverge on purpose. Added config.test.ts covering the derivation.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed fixed: config.ts now derives sdkEnv from the shared GEMINI_API_BASE_URL (sandbox hostname maps to sandbox) when no explicit override is set, and server.ts passes that sdkClient into the prediction tools.

const response = await client.predictions.listEvents(
input as SdkInput<typeof client.predictions.listEvents>
);
return response as unknown as EventsResponse;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Important: Map SDK settlement fields to the legacy event shape

The migrated datasource casts the SDK Event response directly to the legacy shape without mapping settlement fields. For a settled event, the SDK schema places the value at settlement.value and the timestamp at resolvedAt, so listRecentlySettled() returns settlementValue and settlementTime as undefined; the daemon then emits alerts without the settlement value or time. Normalize these fields before returning the legacy contract.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 7a73521 — added a normalizeEvent/normalizeEvents helper in market-data.ts that explicitly maps settlement.value/resolvedAt onto settlementValue/settlementTime (preferring an already-flat field if the API ever sends one directly), applied to every function that returns event(s) — not just listRecentlySettled, since any event can carry settlement data. Added test coverage for the nested mapping, the flat-field-preference case, and the no-settlement-data case.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed fixed: normalizeEvent now maps nested settlement.value and resolvedAt to settlementValue and settlementTime, and listRecentlySettled passes its response through normalizeEvents before returning it.

test('listEvents sends category/status as plain (unbracketed) input keys', async () => {
const { client, calls } = fakeClient({ data: [], pagination: { limit: 50, offset: 0 } });

await predictions.listEvents(client, { status: ['active'], category: ['Sports', 'Crypto'] });

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Suggestion: List option forwarding is not covered

The list tests cover only category/status (and category for the other list methods), leaving the migrated search, limit, and offset forwarding branches untested. Passing pagination or search options can regress to omission or the wrong numeric shape while every current assertion passes; cover the full input contract for each list wrapper.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 7a73521 — added coverage for search/limit/offset forwarding on listEvents, and limit/offset on listUpcoming/listNewlyListed/listRecentlySettled.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed fixed: The test file now contains explicit forwarding tests asserting search/limit/offset for listEvents and limit/offset for listUpcoming, listNewlyListed, and listRecentlySettled.

- config.ts: derive sdkEnv from GEMINI_API_BASE_URL by default so setting only
  the documented sandbox base URL routes prediction-market SDK calls to
  sandbox too, instead of silently defaulting to production when the
  separate GEMINI_SDK_ENV var is left unset. GEMINI_SDK_ENV still overrides
  explicitly.
- market-data.ts: normalize the SDK's nested settlement.value/resolvedAt
  fields onto the legacy flat settlementValue/settlementTime shape that
  PredictionEvent and the settlement-alert fetcher expect, instead of
  trusting a blind cast. Applies to every function that returns event(s).
- market-data.test.ts: add coverage for the settlement-field normalization
  (nested mapping, flat-field preference, and the no-settlement-data case)
  and for search/limit/offset forwarding on the list endpoints.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@sdlc-pr-bot

sdlc-pr-bot Bot commented Sep 21, 2026 •

Copy link
Copy Markdown

Change Control Evidence Check

Authorization — ✅ Pass

Evidence:

  • Linear ticket: PREDICT-8820
  • Change owner: Sohum Desai
  • Type of change: Normal
Testing — ✅ Pass

Evidence:

  • Tests from CI checks: ➖ No tests ran
  • Security scans: ✅ Passed
  • Testing summary: ✅ Found in PR description
    • Summary: All automated tests passed (311/311 with zero regressions), type checking completed without errors, and the build succeeded cleanly. Unit tests were updated in market-data.test.ts with a revised mock harness for SdkClient.predictions.
  • Evidence link: View run
Approval — ✅ Pass

Evidence:

  • Approver: Maneesh Kolli
  • Approval source: GitHub PR Review
  • Approval timestamp: 2026-09-21 18:54 UTC
Segregation of Duties — ✅ Pass

Validated:

  • PR author: SohumDesai27
  • Commit author(s): SohumDesai27
  • Linear assignee: Sohum Desai
  • Approver: Maneesh Kolli
  • Result: Implementer and approver are different people ✅

Last checked: 2026-09-21 19:12 UTC

↩ Re-run Clarissa if tickets, CI, or approvals have changed.

@svc-grace svc-grace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agentic Review

Nice progress — the list option forwarding, legacy settlement-field mapping, and configured API-base handling are all resolved. The remaining follow-up is narrower: production SDK environment derivation isn't covered by tests, and the inline note has the details. There are no blocking findings in this pass, so this is unblocked with that test-coverage polish still worth a look.

Review process

Grace version: v0.0.210
Files reviewed (4): config.test.ts, config.ts, market-data.test.ts, market-data.ts
Files skipped: 7
Guidelines: none discovered
Verification: 1 of 4 findings verified
Findings: 0 critical, 0 important, 1 suggestion
Linked tickets: PREDICT-8820
LLM usage: 87 calls — gpt-5.6-luna: 61 calls, 2470721 tokens, us.anthropic.claude-opus-4-6-v1: 26 calls, 727825 tokens

Comment thread packages/mcp-server/src/config.test.ts Outdated

const { config } = await import('./config.js');

test('sdkEnv derives from GEMINI_API_BASE_URL when GEMINI_SDK_ENV is unset, so the two selectors cannot diverge', () => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Suggestion: Production SDK environment derivation is untested

This suite covers only the unset-variable/sandbox-URL case; it does not exercise the new production derivation or the empty-value path. With GEMINI_API_BASE_URL=https://api.gemini.com, a regression that selects sandbox would route SDK calls to sandbox without CI detecting it; add cases for the production and empty-value paths.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 23d36e5 — exported resolveSdkEnv as a pure function of (baseUrl, sdkEnvOverride) instead of reading GEMINI_SDK_ENV internally, so it's directly unit-testable without env-var-before-import gymnastics. Added cases for the production-derivation path, both the unset and empty-value override forms, the explicit-override-wins-either-direction cases, the invalid-override throw, and a malformed-base-URL fallback.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed fixed: config.test.ts now directly covers production derivation with both unset and empty overrides, plus the sandbox and explicit-override cases requested.

…de paths (PREDICT-8820)

Export resolveSdkEnv as a pure function of (baseUrl, sdkEnvOverride) instead of
reading GEMINI_SDK_ENV internally, so every derivation path is directly
unit-testable without env-var-before-import gymnastics. Addresses svc-grace's
follow-up suggestion that only the sandbox-URL/unset-override case was covered.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

@svc-grace svc-grace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agentic Review

Good progress — the production SDK environment derivation, list-option forwarding, legacy settlement mapping, and API-base wiring concerns are all resolved. This pass found one blocking configuration issue: the alert daemon drops the SDK environment override, so alerts can target the wrong environment; the related config test also doesn’t prove explicit overrides. Please address that before merge.

Review process

Grace version: v0.0.210
Files reviewed (2): config.test.ts, config.ts
Files skipped: 12
Guidelines: none discovered
Verification: 2 of 2 findings verified
Findings: 0 critical, 1 important, 1 suggestion
Linked tickets: PREDICT-8820
LLM usage: 38 calls — gpt-5.6-luna: 27 calls, 723232 tokens, us.anthropic.claude-opus-4-6-v1: 11 calls, 277552 tokens

wsUrl: process.env.GEMINI_WS_URL ?? 'wss://ws.gemini.com',
account: process.env.GEMINI_ACCOUNT ?? '',
sdkEnv: resolveSdkEnv(),
sdkEnv: resolveSdkEnv(baseUrl, process.env.GEMINI_SDK_ENV),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Important: Alert daemon drops the SDK environment override

config.sdkEnv honors GEMINI_SDK_ENV, but the alert supervisor does not preserve that variable when it writes the daemon environment. When an operator sets GEMINI_SDK_ENV=sandbox with a production-looking GEMINI_API_BASE_URL, the MCP server uses sandbox while an installed alert daemon derives production and fetches settlements from the wrong environment. Add GEMINI_SDK_ENV to the supervisor environment whitelist and document the override.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 3b88bd0 — added GEMINI_SDK_ENV to ENV_WHITELIST in alerts/supervisor/types.ts, so an explicit override survives daemon install. Added a regression test (pickWhitelistedEnv preserves an explicit GEMINI_SDK_ENV override) plus an ENV_WHITELIST membership check.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed fixed: ENV_WHITELIST now includes GEMINI_SDK_ENV in packages/mcp-server/src/alerts/supervisor/types.ts, and the supervisor regression test verifies pickWhitelistedEnv preserves an explicit sandbox override; config.ts documents and consumes the override.

// GEMINI_API_BASE_URL/GEMINI_SDK_ENV at module load, not just that the function
// itself is correct in isolation (covered above).
assert.strictEqual(config.baseUrl, SANDBOX_URL);
assert.strictEqual(config.sdkEnv, 'sandbox');

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Suggestion: Config integration does not prove explicit SDK environment overrides

The module-load integration test exercises only an unset override, while explicit override handling is tested only by calling resolveSdkEnv() directly. With GEMINI_API_BASE_URL set to sandbox and GEMINI_SDK_ENV=production, a regression that stops passing the environment override into config would still pass every test and route SDK calls to sandbox instead of production. Add startup coverage for the explicit override path.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 3b88bd0 — added config.override.test.ts, a separate test file/process setting GEMINI_API_BASE_URL to sandbox and GEMINI_SDK_ENV=production together, then importing config fresh and asserting the override wins at module-load time (not just when calling resolveSdkEnv() directly).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed fixed: config.override.test.ts sets sandbox GEMINI_API_BASE_URL and production GEMINI_SDK_ENV before a fresh config import, then asserts config.sdkEnv is production, directly covering module-load override forwarding.

…lert daemon (PREDICT-8820)

The alert supervisor's ENV_WHITELIST (baked into the daemon's persistent
OS-supervised unit on install) never included GEMINI_SDK_ENV, so an operator's
explicit override was silently dropped once installed — the daemon would then
derive sdkEnv from GEMINI_API_BASE_URL alone and fetch prediction-market
settlements from a different environment than the live MCP server process.
Inert before this PR (the daemon never consumed sdkClient), now load-bearing
since PREDICT-8820 wires it into the settlement-alert fetcher.

Also adds a startup-integration test proving an explicit GEMINI_SDK_ENV
override reaches config even against a sandbox base URL, per svc-grace's
follow-up suggestion that only the unset-override path was covered.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

@svc-grace svc-grace left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agentic Review

Nice progress — all six carried-over concerns are resolved in code, including the SDK environment wiring, option forwarding, legacy settlement mapping, and prediction base-URL handling. This pass found no new issues. The remaining confidence gap is the settlement-alert path: the real settled-event shape and end-to-end alert behavior still need verification, especially for preserving settlement fields through the SDK response.

Review process

Grace version: v0.0.210
Files reviewed (3): config.override.test.ts, index.test.ts, types.ts
Files skipped: 14
Suggestions damped: 2 (pass 4 with nothing blocking — new suggestion-level findings are withheld so the review converges, TOOLS-6878)
Guidelines: none discovered
Verification: 0 of 2 findings verified
Findings: 0 critical, 0 important, 0 suggestions
Linked tickets: PREDICT-8820
LLM usage: 28 calls — gpt-5.6-luna: 24 calls, 429126 tokens, us.anthropic.claude-haiku-4-5-20251001-v1:0: 1 call, 12811 tokens, us.anthropic.claude-sonnet-4-6: 3 calls, 71626 tokens

@SohumDesai27
SohumDesai27 merged commit b9086c6 into main Sep 21, 2026
11 checks passed
Sign up for free to 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.

3 participants