@jsonstudio/rcc 0.89.164 → 0.89.168

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/build-info.js +3 -3
  2. package/dist/build-info.js.map +1 -1
  3. package/dist/providers/core/config/service-profiles.js +15 -1
  4. package/dist/providers/core/config/service-profiles.js.map +1 -1
  5. package/dist/providers/core/runtime/base-provider.d.ts +6 -1
  6. package/dist/providers/core/runtime/base-provider.js +51 -103
  7. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  8. package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +1 -2
  9. package/dist/providers/core/runtime/gemini-cli-http-provider.js +9 -5
  10. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  11. package/dist/providers/core/runtime/gemini-http-provider.d.ts +1 -2
  12. package/dist/providers/core/runtime/gemini-http-provider.js +0 -12
  13. package/dist/providers/core/runtime/gemini-http-provider.js.map +1 -1
  14. package/dist/providers/core/runtime/http-request-executor.d.ts +42 -0
  15. package/dist/providers/core/runtime/http-request-executor.js +133 -0
  16. package/dist/providers/core/runtime/http-request-executor.js.map +1 -0
  17. package/dist/providers/core/runtime/http-transport-provider.d.ts +7 -12
  18. package/dist/providers/core/runtime/http-transport-provider.js +168 -368
  19. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  20. package/dist/providers/core/runtime/provider-error-classifier.d.ts +25 -0
  21. package/dist/providers/core/runtime/provider-error-classifier.js +139 -0
  22. package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -0
  23. package/dist/providers/core/runtime/provider-error-types.d.ts +23 -0
  24. package/dist/providers/core/runtime/provider-error-types.js +2 -0
  25. package/dist/providers/core/runtime/provider-error-types.js.map +1 -0
  26. package/dist/providers/core/runtime/provider-factory.js +6 -0
  27. package/dist/providers/core/runtime/provider-factory.js.map +1 -1
  28. package/package.json +3 -2
  29. package/scripts/pack-mode.mjs +30 -1
  30. package/scripts/publish-rcc.mjs +31 -0
@@ -0,0 +1,133 @@
1
+ import { attachProviderSseSnapshotStream, shouldCaptureProviderStreamSnapshots, writeProviderSnapshot } from '../utils/snapshot-writer.js';
2
+ export class HttpRequestExecutor {
3
+ httpClient;
4
+ deps;
5
+ constructor(httpClient, deps) {
6
+ this.httpClient = httpClient;
7
+ this.deps = deps;
8
+ }
9
+ async execute(processedRequest, context) {
10
+ const prepared = await this.prepareHttpRequest(processedRequest, context);
11
+ await this.snapshotProviderRequest(prepared, context);
12
+ try {
13
+ return await this.executeHttpRequestWithRetries(prepared, processedRequest, context);
14
+ }
15
+ catch (error) {
16
+ const normalized = await this.deps.normalizeHttpError(error, processedRequest, prepared, context);
17
+ throw normalized;
18
+ }
19
+ }
20
+ async prepareHttpRequest(processedRequest, context) {
21
+ const wantsSse = this.deps.wantsUpstreamSse(processedRequest, context);
22
+ const defaultEndpoint = this.deps.getEffectiveEndpoint();
23
+ const endpoint = this.deps.resolveRequestEndpoint(processedRequest, defaultEndpoint);
24
+ const headers = await this.deps.buildRequestHeaders();
25
+ let finalHeaders = await this.deps.finalizeRequestHeaders(headers, processedRequest);
26
+ finalHeaders = this.deps.applyStreamModeHeaders(finalHeaders, wantsSse);
27
+ const targetUrl = `${this.deps.getEffectiveBaseUrl().replace(/\/$/, '')}/${endpoint.startsWith('/') ? endpoint.slice(1) : endpoint}`;
28
+ const finalBody = this.deps.buildHttpRequestBody(processedRequest);
29
+ if (wantsSse) {
30
+ this.deps.prepareSseRequestBody(finalBody, context);
31
+ }
32
+ const entryEndpoint = this.deps.getEntryEndpointFromPayload(processedRequest);
33
+ const clientRequestId = this.deps.getClientRequestIdFromContext(context);
34
+ return {
35
+ endpoint,
36
+ headers: finalHeaders,
37
+ targetUrl,
38
+ body: finalBody,
39
+ entryEndpoint,
40
+ clientRequestId,
41
+ wantsSse
42
+ };
43
+ }
44
+ async snapshotProviderRequest(requestInfo, context) {
45
+ try {
46
+ await writeProviderSnapshot({
47
+ phase: 'provider-request',
48
+ requestId: context.requestId,
49
+ data: requestInfo.body,
50
+ headers: requestInfo.headers,
51
+ url: requestInfo.targetUrl,
52
+ entryEndpoint: requestInfo.entryEndpoint,
53
+ clientRequestId: requestInfo.clientRequestId
54
+ });
55
+ }
56
+ catch {
57
+ /* ignore snapshot failures */
58
+ }
59
+ }
60
+ async executeHttpRequestWithRetries(requestInfo, processedRequest, context) {
61
+ const captureSse = shouldCaptureProviderStreamSnapshots();
62
+ const maxAttempts = this.deps.getHttpRetryLimit();
63
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
64
+ try {
65
+ return await this.executeHttpRequestOnce(requestInfo, context, captureSse);
66
+ }
67
+ catch (error) {
68
+ if (this.deps.tryRecoverOAuthAndReplay) {
69
+ const oauthReplay = await this.deps.tryRecoverOAuthAndReplay(error, requestInfo, processedRequest, captureSse, context);
70
+ if (oauthReplay) {
71
+ return oauthReplay;
72
+ }
73
+ }
74
+ const shouldRetry = this.deps.shouldRetryHttpError(error, attempt, maxAttempts);
75
+ if (shouldRetry) {
76
+ await this.deps.delayBeforeHttpRetry(attempt);
77
+ continue;
78
+ }
79
+ throw error;
80
+ }
81
+ }
82
+ throw new Error('provider-runtime-error: http retries exhausted');
83
+ }
84
+ async executeHttpRequestOnce(requestInfo, context, captureSse) {
85
+ if (requestInfo.wantsSse) {
86
+ const upstreamStream = await this.httpClient.postStream(requestInfo.endpoint, requestInfo.body, requestInfo.headers);
87
+ const streamForHost = captureSse
88
+ ? attachProviderSseSnapshotStream(upstreamStream, {
89
+ requestId: context.requestId,
90
+ headers: requestInfo.headers,
91
+ url: requestInfo.targetUrl,
92
+ entryEndpoint: requestInfo.entryEndpoint,
93
+ clientRequestId: requestInfo.clientRequestId
94
+ })
95
+ : upstreamStream;
96
+ const wrapped = await this.deps.wrapUpstreamSseResponse(streamForHost, context);
97
+ if (!captureSse) {
98
+ try {
99
+ await writeProviderSnapshot({
100
+ phase: 'provider-response',
101
+ requestId: context.requestId,
102
+ data: { mode: 'sse' },
103
+ headers: requestInfo.headers,
104
+ url: requestInfo.targetUrl,
105
+ entryEndpoint: requestInfo.entryEndpoint,
106
+ clientRequestId: requestInfo.clientRequestId
107
+ });
108
+ }
109
+ catch {
110
+ /* ignore snapshot failures */
111
+ }
112
+ }
113
+ return wrapped;
114
+ }
115
+ const response = await this.httpClient.post(requestInfo.endpoint, requestInfo.body, requestInfo.headers);
116
+ try {
117
+ await writeProviderSnapshot({
118
+ phase: 'provider-response',
119
+ requestId: context.requestId,
120
+ data: response,
121
+ headers: requestInfo.headers,
122
+ url: requestInfo.targetUrl,
123
+ entryEndpoint: requestInfo.entryEndpoint,
124
+ clientRequestId: requestInfo.clientRequestId
125
+ });
126
+ }
127
+ catch {
128
+ /* ignore snapshot failures */
129
+ }
130
+ return response;
131
+ }
132
+ }
133
+ //# sourceMappingURL=http-request-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-request-executor.js","sourceRoot":"","sources":["../../../../src/providers/core/runtime/http-request-executor.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,6 @@
10
10
  */
11
11
  import { BaseProvider } from './base-provider.js';
12
12
  import { HttpClient } from '../utils/http-client.js';
13
- import { HookSystemIntegration } from '../hooks/hooks-integration.js';
14
13
  import type { IAuthProvider } from '../../auth/auth-interface.js';
15
14
  import type { OpenAIStandardConfig } from '../api/provider-config.js';
16
15
  import type { ProviderContext, ServiceProfile } from '../api/provider-types.js';
@@ -23,10 +22,9 @@ export declare class HttpTransportProvider extends BaseProvider {
23
22
  protected authProvider: IAuthProvider | null;
24
23
  protected httpClient: HttpClient;
25
24
  protected serviceProfile: ServiceProfile;
26
- protected hookSystemIntegration: HookSystemIntegration;
27
25
  protected protocolClient: ProtocolClient;
26
+ private requestExecutor;
28
27
  private injectedConfig;
29
- private readonly hooksEnabled;
30
28
  constructor(config: OpenAIStandardConfig, dependencies: ModuleDependencies, moduleType: string, protocolClient?: HttpProtocolClient<ProtocolRequestPayload>);
31
29
  /**
32
30
  * 确保认证提供者完成初始化(避免 ApiKeyAuthProvider 未初始化导致的报错)
@@ -34,17 +32,10 @@ export declare class HttpTransportProvider extends BaseProvider {
34
32
  protected onInitialize(): Promise<void>;
35
33
  setConfig(cfg: unknown): void;
36
34
  getConfig(): unknown;
37
- /**
38
- * 初始化Hook系统集成
39
- */
40
- private initializeHookSystem;
41
- /**
42
- * 配置Hook调试(保持向后兼容)
43
- */
44
- private configureHookDebugging;
45
35
  protected getServiceProfile(): ServiceProfile;
46
36
  protected createAuthProvider(): IAuthProvider;
47
37
  protected createHttpClient(): void;
38
+ private createRequestExecutorDeps;
48
39
  protected preprocessRequest(request: UnknownObject): Promise<UnknownObject>;
49
40
  protected postprocessResponse(response: unknown, context: ProviderContext): Promise<UnknownObject>;
50
41
  protected sendRequestInternal(request: UnknownObject): Promise<unknown>;
@@ -53,6 +44,11 @@ export declare class HttpTransportProvider extends BaseProvider {
53
44
  protected prepareSseRequestBody(_body: UnknownObject, _context: ProviderContext): void;
54
45
  protected wrapUpstreamSseResponse(stream: NodeJS.ReadableStream, _context: ProviderContext): Promise<UnknownObject>;
55
46
  protected performHealthCheck(url: string): Promise<boolean>;
47
+ private getHttpRetryLimit;
48
+ private delayBeforeHttpRetry;
49
+ private shouldRetryHttpError;
50
+ private tryRecoverOAuthAndReplay;
51
+ private normalizeHttpError;
56
52
  /**
57
53
  * 为特定请求确定最终 endpoint(默认使用配置值,可由子类覆写)
58
54
  */
@@ -72,7 +68,6 @@ export declare class HttpTransportProvider extends BaseProvider {
72
68
  protected getEffectiveEndpoint(): string;
73
69
  private pickRuntimeBaseUrl;
74
70
  private looksLikeAbsoluteUrl;
75
- private getHookManager;
76
71
  private getConfigExtensions;
77
72
  private getEntryEndpointFromPayload;
78
73
  private asResponseRecord;