Skip to content

[feat/client-sdk] feat(pkg/client): add Go SDK client for cliproxyapi++ proxy API#890

Merged
KooshaPari merged 5 commits intomainfrom
feat/client-sdk
Mar 25, 2026
Merged

[feat/client-sdk] feat(pkg/client): add Go SDK client for cliproxyapi++ proxy API#890
KooshaPari merged 5 commits intomainfrom
feat/client-sdk

Conversation

@KooshaPari
Copy link
Copy Markdown
Owner

Summary

Auto-generated PR for branch feat/client-sdk.

Test plan

N/A (Auto-generated)

KooshaPari and others added 4 commits March 1, 2026 14:41
…#824)

* centralize provider alias normalization in cliproxyctl

* chore(airlock): track default workflow config

Co-authored-by: Codex <noreply@openai.com>

* chore(artifacts): remove stale AI tooling artifacts

Co-authored-by: Codex <noreply@openai.com>

* refactor: phase 2B decomposition - extract kiro auth module and migrate qwen to BaseTokenStorage

Phase 2B decomposition of cliproxyapi++ kiro_executor.go (4,691 LOC):

Core Changes:
- Created pkg/llmproxy/executor/kiro_auth.go: Extracted auth-specific functions from kiro_executor.go
  * kiroCredentials() - Extract access token and profile ARN from auth objects
  * getTokenKey() - Generate unique rate limiting keys from auth credentials
  * isIDCAuth() - Detect IDC vs standard auth methods
  * applyDynamicFingerprint() - Apply token-specific or static User-Agent headers
  * PrepareRequest() - Prepare HTTP requests with auth headers
  * HttpRequest() - Execute authenticated HTTP requests
  * Refresh() - Perform OAuth2 token refresh (SSO OIDC or Kiro OAuth)
  * persistRefreshedAuth() - Persist refreshed tokens to file (atomic write)
  * reloadAuthFromFile() - Reload auth from file for background refresh support
  * isTokenExpired() - Decode and check JWT token expiration

Auth Provider Migration:
- Migrated pkg/llmproxy/auth/qwen/qwen_token.go to use BaseTokenStorage
  * Reduced duplication by embedding auth.BaseTokenStorage
  * Removed redundant token management code (Save, Load, Clear)
  * Added NewQwenTokenStorage() constructor for consistent initialization
  * Preserved ResourceURL as Qwen-specific extension field
  * Refactored SaveTokenToFile() to use BaseTokenStorage.Save()

Design Rationale:
- Auth extraction into kiro_auth.go sets foundation for clean separation of concerns:
  * Core execution logic (kiro_executor.go)
  * Authentication flow (kiro_auth.go)
  * Streaming/SSE handling (future: kiro_streaming.go)
  * Request/response transformation (future: kiro_transform.go)
- Qwen migration demonstrates pattern for remaining providers (openrouter, xai, deepseek)
- BaseTokenStorage inheritance reduces maintenance burden and promotes consistency

Related Infrastructure:
- Graceful shutdown already implemented in cmd/server/main.go via signal.NotifyContext
- Server.Run() in SDK handles SIGINT/SIGTERM with proper HTTP server shutdown
- No changes needed for shutdown handling in this phase

Notes for Follow-up:
- Future commits should extract streaming logic from kiro_executor.go lines 1078-3615
- Transform logic extraction needed for lines 527-542 and related payload handling
- Consider kiro token.go for BaseTokenStorage migration (domain-specific fields: AuthMethod, Provider, ClientID)
- Complete vertex token migration (service account credentials pattern)

Testing:
- Code formatting verified (go fmt)
- No pre-existing build issues introduced
- Build failures are pre-existing in canonical main

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Airlock: auto-fixes from Lint & Format Fixes

---------

Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…825)

Split the 4691-line kiro_executor.go into three focused files:

- kiro_transform.go (~470 LOC): endpoint config types, region resolution,
  payload builders (buildKiroPayloadForFormat, sanitizeKiroPayload),
  model mapping (mapModelToKiro), credential extraction (kiroCredentials),
  and auth-method helpers (getEffectiveProfileArnWithWarning, isIDCAuth).

- kiro_streaming.go (~2990 LOC): streaming execution (ExecuteStream,
  executeStreamWithRetry), AWS Event Stream parsing (parseEventStream,
  readEventStreamMessage, extractEventTypeFromBytes), channel-based
  streaming (streamToChannel), and the full web search MCP handler
  (handleWebSearchStream, handleWebSearch, callMcpAPI, etc.).

- kiro_executor.go (~1270 LOC): core executor struct (KiroExecutor),
  HTTP client pool, retry logic, Execute/executeWithRetry,
  CountTokens, Refresh, and token persistence helpers.

All functions remain in the same package; no public API changes.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Ports the cliproxy adapter responsibilities from thegent Python code
(cliproxy_adapter.py, cliproxy_error_utils.py, cliproxy_header_utils.py,
cliproxy_models_transform.py) into a canonical Go SDK package so consumers
no longer need to reimplement raw HTTP calls.

pkg/llmproxy/client/ provides:
- client.go  — Client with Health, ListModels, ChatCompletion, Responses
- types.go   — Request/response types + Option wiring
- client_test.go — 13 httptest-based unit tests (all green)

Handles both proxy-normalised {"models":[...]} and raw OpenAI
{"data":[...]} shapes, propagates x-models-etag, surfaces APIError
with status code and structured message, and enforces non-streaming on
all methods (streaming is left to callers via net/http directly).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@gemini-code-assist
Copy link
Copy Markdown

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 25, 2026

Warning

Rate limit exceeded

@KooshaPari has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 18 minutes and 55 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: c778b2f1-6759-4a09-9c13-81ce2cee9254

📥 Commits

Reviewing files that changed from the base of the PR and between 63fc77a and 047c0a3.

📒 Files selected for processing (1)
  • pkg/llmproxy/client/types.go
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/client-sdk

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@KooshaPari KooshaPari merged commit 6e6b8fe into main Mar 25, 2026
28 of 33 checks passed
@KooshaPari KooshaPari deleted the feat/client-sdk branch March 25, 2026 11:22
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.

1 participant