@userdaoo/iflow-api-bridge 0.1.2 → 0.1.3

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.
@@ -5,6 +5,10 @@ import type { ChatCompletionMessage, ChatCompletionResponse, ChatCompletionStrea
5
5
  export declare function generateId(): string;
6
6
  export declare function getTimestamp(): number;
7
7
  export declare function messagesToIFlowPrompt(messages: ChatCompletionMessage[]): string;
8
+ /**
9
+ * 提取 System 消息和 User 消息
10
+ * 兼容 opencode 的非标准格式(role 可能不是 user,但包含实际请求内容)
11
+ */
8
12
  export declare function extractMessages(messages: ChatCompletionMessage[]): {
9
13
  systemMessage: string | undefined;
10
14
  userMessage: string;
@@ -17,7 +21,7 @@ export declare function formatSSE(data: unknown): string;
17
21
  export declare const SSE_DONE = "data: [DONE]\n\n";
18
22
  /**
19
23
  * iFlow 支持的模型列表
20
- * 基于用户实际的 iflow CLI 配置
24
+ * 基于用户实际的 iFlow CLI 配置
21
25
  */
22
26
  export declare const AVAILABLE_MODELS: {
23
27
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../src/openai/transformer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAG5B,SAAS,EAEV,MAAM,YAAY,CAAC;AAEpB,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAO/E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,qBAAqB,EAAE,GAAG;IAClE,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB,CAeA;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,YAAY,GAAE,MAAM,GAAG,QAAQ,GAAG,IAAW,GAC5C,4BAA4B,CAc9B;AAED,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,EAChB,YAAY,GAAE,MAAM,GAAG,QAAiB,GACvC,sBAAsB,CAkBxB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAS5E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE/C;AAED,eAAO,MAAM,QAAQ,qBAAqB,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;GAU5B,CAAC;AAEF,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
1
+ {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../src/openai/transformer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAG5B,SAAS,EAEV,MAAM,YAAY,CAAC;AAEpB,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAO/E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,qBAAqB,EAAE,GAAG;IAClE,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB,CAqCA;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,YAAY,GAAE,MAAM,GAAG,QAAQ,GAAG,IAAW,GAC5C,4BAA4B,CAc9B;AAED,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,EAChB,YAAY,GAAE,MAAM,GAAG,QAAiB,GACvC,sBAAsB,CAkBxB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAS5E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAE/C;AAED,eAAO,MAAM,QAAQ,qBAAqB,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;GAU5B,CAAC;AAEF,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -28,9 +28,14 @@ function messagesToIFlowPrompt(messages) {
28
28
  return `${msg.role}: [复杂内容]`;
29
29
  }).join('\n\n');
30
30
  }
31
+ /**
32
+ * 提取 System 消息和 User 消息
33
+ * 兼容 opencode 的非标准格式(role 可能不是 user,但包含实际请求内容)
34
+ */
31
35
  function extractMessages(messages) {
32
36
  let systemMessage;
33
37
  let userMessage = '';
38
+ // 第一步:查找标准格式的 system 和 user 消息
34
39
  for (const msg of messages) {
35
40
  if (typeof msg.content !== 'string')
36
41
  continue;
@@ -41,6 +46,26 @@ function extractMessages(messages) {
41
46
  userMessage = msg.content;
42
47
  }
43
48
  }
49
+ // 第二步:如果没有找到 user 消息,尝试其他角色(developer, assistant 等)
50
+ if (!userMessage) {
51
+ for (const msg of messages) {
52
+ if (typeof msg.content !== 'string')
53
+ continue;
54
+ if (msg.role !== 'system' && msg.content.trim()) {
55
+ userMessage = msg.content;
56
+ break;
57
+ }
58
+ }
59
+ }
60
+ // 第三步:如果还是没有,拼接所有非 system 消息
61
+ if (!userMessage) {
62
+ const nonSystemContents = messages
63
+ .filter(msg => msg.role !== 'system' && typeof msg.content === 'string')
64
+ .map(msg => msg.content);
65
+ if (nonSystemContents.length > 0) {
66
+ userMessage = nonSystemContents.join('\n\n');
67
+ }
68
+ }
44
69
  return { systemMessage, userMessage };
45
70
  }
46
71
  function createStreamChunk(id, model, content, finishReason = null) {
@@ -93,7 +118,7 @@ function formatSSE(data) {
93
118
  exports.SSE_DONE = 'data: [DONE]\n\n';
94
119
  /**
95
120
  * iFlow 支持的模型列表
96
- * 基于用户实际的 iflow CLI 配置
121
+ * 基于用户实际的 iFlow CLI 配置
97
122
  */
98
123
  exports.AVAILABLE_MODELS = [
99
124
  { id: 'glm-4.7', name: 'GLM-4.7 (Default)' },
@@ -1 +1 @@
1
- {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../src/openai/transformer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../src/openai/transformer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@userdaoo/iflow-api-bridge",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "将 iFlow LLM 服务暴露为 OpenAI 兼容 API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,6 +29,10 @@ export function messagesToIFlowPrompt(messages: ChatCompletionMessage[]): string
29
29
  }).join('\n\n');
30
30
  }
31
31
 
32
+ /**
33
+ * 提取 System 消息和 User 消息
34
+ * 兼容 opencode 的非标准格式(role 可能不是 user,但包含实际请求内容)
35
+ */
32
36
  export function extractMessages(messages: ChatCompletionMessage[]): {
33
37
  systemMessage: string | undefined;
34
38
  userMessage: string;
@@ -36,6 +40,7 @@ export function extractMessages(messages: ChatCompletionMessage[]): {
36
40
  let systemMessage: string | undefined;
37
41
  let userMessage = '';
38
42
 
43
+ // 第一步:查找标准格式的 system 和 user 消息
39
44
  for (const msg of messages) {
40
45
  if (typeof msg.content !== 'string') continue;
41
46
 
@@ -46,6 +51,27 @@ export function extractMessages(messages: ChatCompletionMessage[]): {
46
51
  }
47
52
  }
48
53
 
54
+ // 第二步:如果没有找到 user 消息,尝试其他角色(developer, assistant 等)
55
+ if (!userMessage) {
56
+ for (const msg of messages) {
57
+ if (typeof msg.content !== 'string') continue;
58
+ if (msg.role !== 'system' && msg.content.trim()) {
59
+ userMessage = msg.content;
60
+ break;
61
+ }
62
+ }
63
+ }
64
+
65
+ // 第三步:如果还是没有,拼接所有非 system 消息
66
+ if (!userMessage) {
67
+ const nonSystemContents = messages
68
+ .filter(msg => msg.role !== 'system' && typeof msg.content === 'string')
69
+ .map(msg => msg.content);
70
+ if (nonSystemContents.length > 0) {
71
+ userMessage = nonSystemContents.join('\n\n');
72
+ }
73
+ }
74
+
49
75
  return { systemMessage, userMessage };
50
76
  }
51
77
 
@@ -119,7 +145,7 @@ export const SSE_DONE = 'data: [DONE]\n\n';
119
145
 
120
146
  /**
121
147
  * iFlow 支持的模型列表
122
- * 基于用户实际的 iflow CLI 配置
148
+ * 基于用户实际的 iFlow CLI 配置
123
149
  */
124
150
  export const AVAILABLE_MODELS = [
125
151
  { id: 'glm-4.7', name: 'GLM-4.7 (Default)' },