1392 Commits

Author SHA1 Message Date
CaIon
5ec4633cb8 refactor(task): add CAS-guarded updates to prevent concurrent billing conflicts
Replace all bare task.Update() (DB.Save) calls with UpdateWithStatus(),
which adds a WHERE status = ? guard to prevent concurrent processes from
overwriting each other's state transitions.

Key changes:

model/task.go:
- Add taskSnapshot struct with Equal() method for change detection
- Add Snapshot() method to capture pre-update state
- Add UpdateWithStatus(fromStatus) using DB.Where().Save() for CAS
  semantics with full-struct save (no explicit field listing needed)

model/midjourney.go:
- Add UpdateWithStatus(fromStatus string) with same CAS pattern

service/task_polling.go (updateVideoSingleTask):
- Snapshot before processing upstream response; skip DB write if unchanged
- Terminal transitions (SUCCESS/FAILURE) use UpdateWithStatus CAS:
  billing/refund only executes if this process wins the transition
- Non-terminal updates also use UpdateWithStatus to prevent overwriting
  a concurrent terminal transition back to IN_PROGRESS
- Defer settleTaskBillingOnComplete to after CAS check (shouldSettle flag)

relay/relay_task.go (tryRealtimeFetch):
- Add snapshot + change detection; use UpdateWithStatus for CAS safety

controller/midjourney.go (UpdateMidjourneyTaskBulk):
- Capture preStatus before mutations; use UpdateWithStatus CAS
- Gate refund (IncreaseUserQuota) on CAS success (won && shouldReturnQuota)

This prevents the multi-instance race condition where:
1. Instance A reads task (IN_PROGRESS), fetches upstream (still IN_PROGRESS)
2. Instance B reads same task, fetches upstream (now SUCCESS), writes SUCCESS
3. Instance A's bare Save() overwrites SUCCESS back to IN_PROGRESS
2026-02-22 16:01:19 +08:00
CaIon
cda540180b refactor(relay): improve channel locking and retry logic in RelayTask
- Enhanced the RelayTask function to utilize a locked channel when available, allowing for better reuse during retries.
- Updated error handling to ensure proper context setup for the selected channel.
- Clarified comments in ResolveOriginTask regarding channel locking and retry behavior.
- Introduced a new field in TaskRelayInfo to store the locked channel object, improving type safety and reducing import cycles.
2026-02-22 16:01:19 +08:00
CaIon
76892e8376 refactor(relay): enhance remix logic for billing context extraction
- Updated the remix handling in ResolveOriginTask to prioritize extracting OtherRatios from the BillingContext of the original task if available.
- Retained the previous logic for extracting seconds and size from task data as a fallback.
- Improved clarity and maintainability of the remix logic by separating the new and old approaches.
2026-02-22 16:01:19 +08:00
CaIon
a920d1f925 refactor(relay): rename RelayTask to RelayTaskFetch and update routing
- Renamed RelayTask function to RelayTaskFetch for clarity.
- Updated routing in relay-router.go and video-router.go to use RelayTaskFetch for fetch operations.
- Enhanced error handling in RelayTaskFetch function.
- Adjusted task data conversion in TaskAdaptor to include task ID.
2026-02-22 16:01:19 +08:00
CaIon
d6e11fd2e1 feat(task): add adaptor billing interface and async settlement framework
Add three billing lifecycle methods to the TaskAdaptor interface:
- EstimateBilling: compute OtherRatios from user request before pricing
- AdjustBillingOnSubmit: adjust ratios from upstream submit response
- AdjustBillingOnComplete: determine final quota at task terminal state

Introduce BaseBilling as embeddable no-op default for adaptors without
custom billing. Move Sora/Ali OtherRatios logic from shared validation
into per-adaptor EstimateBilling implementations.

Add TaskBillingContext to persist pricing params (model_price, group_ratio,
other_ratios) in task private data for async polling settlement.

Extract RecalculateTaskQuota as a general-purpose delta settlement
function and unify polling billing via settleTaskBillingOnComplete
(adaptor-first, then token-based fallback).
2026-02-22 16:00:27 +08:00
CaIon
9e3954428d refactor(task): extract billing and polling logic from controller to service layer
Restructure the task relay system for better separation of concerns:
- Extract task billing into service/task_billing.go with unified settlement flow
- Move task polling loop from controller to service/task_polling.go (supports Suno + video platforms)
- Split RelayTask into fetch/submit paths with dedicated retry logic (taskSubmitWithRetry)
- Add TaskDto, TaskResponse generics, and FetchReq to dto/task.go
- Add taskcommon/helpers.go for shared task adaptor utilities
- Remove controller/task_video.go (logic consolidated into service layer)
- Update all task adaptors (ali, doubao, gemini, hailuo, jimeng, kling, sora, suno, vertex, vidu)
- Simplify frontend task logs to use new TaskDto response format
2026-02-22 16:00:27 +08:00
Seefs
285d7233a3 feat: sync field 2026-02-22 01:27:58 +08:00
Seefs
91b300f522 feat: unify param/header overrides with retry-aware conditions and flexible header operations 2026-02-22 00:45:49 +08:00
Seefs
ff76e75f4c feat: add retry-aware param override with return_error and prune_objects 2026-02-22 00:10:49 +08:00
Seefs
a546871a80 feat: gate Claude inference_geo passthrough behind channel setting and add field docs 2026-02-21 14:25:58 +08:00
wellsgz
452ac1cdb8 feat: add aws claude-sonnet-4-6 model mapping 2026-02-21 13:24:30 +08:00
Seefs
1770a08504 fix: skip field filtering when request passthrough is enabled 2026-02-19 15:09:13 +08:00
Seefs
6004314c88 feat: add missing OpenAI/Claude/Gemini request fields and responses stream options 2026-02-19 14:16:07 +08:00
Seefs
721d0a41fb feat: minimax native /v1/messages 2026-02-17 17:27:57 +08:00
Seefs
4360393dc1 fix: unify usage mapping and include toolUsePromptTokenCount in input tokens 2026-02-17 15:45:14 +08:00
Seefs
c78b37662b fix: ignore header passthrough during channel tests 2026-02-12 15:16:24 +08:00
CaIon
197b89ea58 feat: refactor request body handling to use BodyStorage for improved efficiency 2026-02-12 01:51:27 +08:00
funkpopo
75e533edb0 feat(xai): 为xAI渠道添加/v1/responses支持 (#2897)
* feat(xai): 为xAI渠道添加/v1/responses支持

* Add video generation model to constants

* fix: 修正先前更改中对于grok-3-mini的思考预算和"-search"设计
2026-02-12 00:42:39 +08:00
CaIon
f57f7646d3 feat: refactor extra_body handling for improved configuration parsing 2026-02-11 22:15:22 +08:00
Seefs
34a5323f14 fix streamSupportedChannels 2026-02-11 01:39:01 +08:00
Calcium-Ion
897955256e Merge pull request #2889 from seefs001/feature/messages2responses
feat: /v1/messages -> /v1/responses
2026-02-08 00:25:27 +08:00
Calcium-Ion
bc6810ca5a Merge pull request #2887 from seefs001/fix/claude
fix: 补全 streaming message_delta 事件缺失的 input_tokens 和 cache 相关字段
2026-02-08 00:18:04 +08:00
Calcium-Ion
742f4ad1e4 Merge pull request #2883 from seefs001/fix/claude-relay-info-input-token
fix: 使用openai兼容接口调用部分渠道在最终端点为claude原生端点下还是走了openai扣减input_token的逻辑
2026-02-08 00:17:50 +08:00
Seefs
2faa873caf Merge branch 'feature/messages2responses' into upstream-main
# Conflicts:
#	service/openaicompat/chat_to_responses.go
2026-02-08 00:16:35 +08:00
Calcium-Ion
ce0113a6b5 Merge pull request #2864 from seefs001/fix/thining-summary
fix: add paragraph breaks between reasoning summary chunks
2026-02-08 00:15:32 +08:00
Calcium-Ion
dd5610d39e Merge pull request #2854 from seefs001/fix/claude-tool-index
fix: Claude stream block index/type transitions
2026-02-08 00:15:20 +08:00
Seefs
5f6f95c7c1 Merge pull request #2874 from MUTED64/main
feat: Force beta=true parameter for Anthropic channel
2026-02-08 00:09:28 +08:00
Calcium-Ion
78ddb85f22 Merge pull request #2852 from seefs001/fix/codex-tips
feat: add Codex channel disclaimer (i18n, OpenAI terms)
2026-02-08 00:07:41 +08:00
Seefs
0b3a0b38d6 fix: patch message_delta usage via gjson/sjson and skip on passthrough 2026-02-07 19:13:58 +08:00
Thomas
bbad917101 fix: 补全 streaming message_delta 事件缺失的 input_tokens 和 cache 相关字段 (#2881)
当上游为 AWS Bedrock 时,message_delta 的 usage 可能缺少 input_tokens、
cache_creation_input_tokens、cache_read_input_tokens 等字段,导致与原生
Anthropic 格式不一致。从 message_start 积累的 claudeInfo 中补全这些字段后
重新序列化,确保客户端收到一致的 usage 格式。
2026-02-07 18:17:22 +08:00
Seefs
a0bb78edd0 fix: 使用openai兼容接口调用部分渠道在最终端点为claude原生端点下还是走了openai扣减input_token的逻辑 2026-02-07 14:21:19 +08:00
CaIon
0c0ccf510b refactor: 抽象统一计费会话 BillingSession
将散落在多个文件中的预扣费/结算/退款逻辑抽象为统一的 BillingSession 生命周期管理:

- 新增 BillingSettler 接口 (relay/common/billing.go) 避免循环引用
- 新增 FundingSource 接口 + WalletFunding / SubscriptionFunding 实现 (service/funding_source.go)
- 新增 BillingSession 封装预扣/结算/退款原子操作 (service/billing_session.go)
- 新增 SettleBilling 统一结算辅助函数,替换各 handler 中的 quotaDelta 模式
- 重写 PreConsumeBilling 为 BillingSession 工厂入口
- controller/relay.go 退款守卫改用 BillingSession.Refund()

修复的 Bug:
- 令牌额度泄漏:PreConsumeTokenQuota 成功但 DecreaseUserQuota 失败时未回滚
- 订阅退款遗漏:FinalPreConsumedQuota=0 但 SubscriptionPreConsumed>0 时跳过退款
- 订阅多扣费:subConsume 强制为 1 但 FinalPreConsumedQuota 不同步
- 退款路径不统一:钱包/订阅退款逻辑现统一由 FundingSource.Refund 分派
2026-02-06 23:14:25 +08:00
MUTED64
4332837f05 feat: Force beta=true parameter for Anthropic channel 2026-02-06 21:22:39 +08:00
Seefs
aa8240e482 feat: /v1/messages -> /v1/responses 2026-02-06 15:22:32 +08:00
Seefs
a1695b7657 feat: gpt-5.3-codex 2026-02-06 14:47:23 +08:00
Seefs
b580b8bd1d fix: add paragraph breaks between reasoning summary chunks in chat2responses stream 2026-02-06 14:46:29 +08:00
Papersnake
8e6071f146 Merge branch 'feat/claude-opus-4-6' of https://github.com/prnake/new-api into feat/claude-opus-4-6 2026-02-06 11:59:14 +08:00
Papersnake
729610beb0 fix: set temperature to 1 2026-02-06 11:56:38 +08:00
Papersnake
c9f5de7048 feat: support adaptive thinking 2026-02-06 11:01:23 +08:00
Papersnake
ff71786d8d fix: aws claude 2026-02-06 09:51:15 +08:00
Papersnake
2504818b5a feat: add claude-opus-4-6 2026-02-06 09:12:45 +08:00
CaIon
b55e42eda7 feat(api): add 'cookie' to passthroughSkipHeaderNamesLower 2026-02-05 22:16:35 +08:00
Seefs
7314c974f3 fix: Claude stream block index/type transitions 2026-02-05 19:32:26 +08:00
CaIon
1d611d89d2 remove: drop support for claude-2 and claude-1 series models
- Remove claude-instant-1.2, claude-2, claude-2.0, claude-2.1 from model lists
- Remove /v1/complete endpoint support (legacy completion API)
- Remove RequestModeCompletion and related code paths
- Simplify handler functions by removing requestMode parameter
- Update all channel adaptors that referenced claude handlers
2026-02-05 17:20:46 +08:00
Seefs
ecebd619a4 fix: charge local input tokens when Gemini returns empty response 2026-02-05 15:57:17 +08:00
dahetaoa
05ed9d43af fix(relay/codex): optimize headers and ensure instructions presence 2026-02-04 21:43:33 +00:00
Calcium-Ion
a21ee5f9ed Merge pull request #2840 from seefs001/feature/header-regex-override
feat: 支持基于Go Regex规则和全量的请求体透传
2026-02-05 01:56:27 +08:00
Seefs
f3e6585441 feat: add header passthrough 2026-02-05 01:43:49 +08:00
Seefs
32fae53a3f fix reasoning_effort log 2026-02-05 00:31:52 +08:00
Seefs
7e13a01a96 fix: map Responses reasoning stream to chat completion deltas
fix: default summary = detailed

fix ReasoningContent

fix ReasoningContent

fix ReasoningContent

fix ReasoningContent

Revert "fix ReasoningContent"

This reverts commit 45a88f78b91ce2376bca68745d19374bb9e95e88.

fix ReasoningContent

fix ReasoningContent
2026-02-05 00:12:16 +08:00