mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-14 12:02:27 +08:00
- 模型感知 instructions:刷新 instructions.txt 至最新 GPT-5-Codex prompt,新增 GPT-5.1 / GPT-5.2 真实 Codex 编码 agent prompt;新增 openai.CodexBaseInstructionsForModel 按模型选用(codex 系→GPT-5-Codex,gpt-5.2→GPT-5.2,gpt-5.1/gpt-5→GPT-5.1), defaultCodexSynthInstructions 改为按 model 选择 - client_metadata:OAuth /responses 请求用账号真实 openai_device_id 注入 client_metadata["x-codex-installation-id"];加法式、幂等、不覆盖既有项, 无 device_id(非 OAuth 账号)则不写入、不伪造 - anthropic 转换补全 SSE 事件 reasoning_text.delta 与 custom_tool_call_input.delta (含 custom_tool_call item 注册为 tool_use),与 chat completions 路径对齐 - 新增单元测试覆盖以上行为(apicompat / openai / service) 承接上一提交,仍为加法式改进,不改动既有可工作的请求头。
82 lines
3.3 KiB
Go
82 lines
3.3 KiB
Go
// Package openai provides helpers and types for OpenAI API integration.
|
||
package openai
|
||
|
||
import (
|
||
_ "embed"
|
||
"strings"
|
||
)
|
||
|
||
// Model represents an OpenAI model
|
||
type Model struct {
|
||
ID string `json:"id"`
|
||
Object string `json:"object"`
|
||
Created int64 `json:"created"`
|
||
OwnedBy string `json:"owned_by"`
|
||
Type string `json:"type"`
|
||
DisplayName string `json:"display_name"`
|
||
}
|
||
|
||
// DefaultModels OpenAI models list
|
||
var DefaultModels = []Model{
|
||
{ID: "gpt-5.5", Object: "model", Created: 1776873600, OwnedBy: "openai", Type: "model", DisplayName: "GPT-5.5"},
|
||
{ID: "gpt-5.4", Object: "model", Created: 1738368000, OwnedBy: "openai", Type: "model", DisplayName: "GPT-5.4"},
|
||
{ID: "gpt-5.4-mini", Object: "model", Created: 1738368000, OwnedBy: "openai", Type: "model", DisplayName: "GPT-5.4 Mini"},
|
||
{ID: "gpt-5.3-codex", Object: "model", Created: 1735689600, OwnedBy: "openai", Type: "model", DisplayName: "GPT-5.3 Codex"},
|
||
{ID: "gpt-5.3-codex-spark", Object: "model", Created: 1735689600, OwnedBy: "openai", Type: "model", DisplayName: "GPT-5.3 Codex Spark"},
|
||
{ID: "gpt-5.2", Object: "model", Created: 1733875200, OwnedBy: "openai", Type: "model", DisplayName: "GPT-5.2"},
|
||
{ID: "gpt-image-1", Object: "model", Created: 1733875200, OwnedBy: "openai", Type: "model", DisplayName: "GPT Image 1"},
|
||
{ID: "gpt-image-1.5", Object: "model", Created: 1735689600, OwnedBy: "openai", Type: "model", DisplayName: "GPT Image 1.5"},
|
||
{ID: "gpt-image-2", Object: "model", Created: 1738368000, OwnedBy: "openai", Type: "model", DisplayName: "GPT Image 2"},
|
||
}
|
||
|
||
// DefaultModelIDs returns the default model ID list
|
||
func DefaultModelIDs() []string {
|
||
ids := make([]string, len(DefaultModels))
|
||
for i, m := range DefaultModels {
|
||
ids[i] = m.ID
|
||
}
|
||
return ids
|
||
}
|
||
|
||
// DefaultTestModel default model for testing OpenAI accounts
|
||
const DefaultTestModel = "gpt-5.4"
|
||
|
||
// DefaultInstructions default instructions for non-Codex CLI requests.
|
||
// 内容为真实 Codex CLI 的 GPT-5-Codex base prompt(codex 系模型默认)。
|
||
//
|
||
//go:embed instructions.txt
|
||
var DefaultInstructions string
|
||
|
||
// instructionsGPT51 / instructionsGPT52 为 gpt-5.1 / gpt-5.2 非 codex 模型对应的
|
||
// 真实 Codex 编码 agent base prompt,用于模型感知的 instructions 选择。
|
||
//
|
||
//go:embed instructions_gpt5_1.txt
|
||
var instructionsGPT51 string
|
||
|
||
//go:embed instructions_gpt5_2.txt
|
||
var instructionsGPT52 string
|
||
|
||
// CodexBaseInstructionsForModel 按模型返回最匹配的真实 Codex base instructions:
|
||
// - 含 "codex" 的模型(gpt-5-codex / gpt-5.x-codex / codex-max / spark 等)→ GPT-5-Codex prompt
|
||
// - gpt-5.2 系非 codex 模型 → GPT-5.2 prompt
|
||
// - gpt-5.1 / gpt-5 系非 codex 模型 → GPT-5.1 prompt
|
||
// - 其它 → 回退到 GPT-5-Codex prompt
|
||
//
|
||
// 任一专用 prompt 意外为空时回退到 DefaultInstructions,保证返回非空。
|
||
func CodexBaseInstructionsForModel(model string) string {
|
||
m := strings.ToLower(strings.TrimSpace(model))
|
||
switch {
|
||
case strings.Contains(m, "codex"):
|
||
return DefaultInstructions
|
||
case strings.HasPrefix(m, "gpt-5.2"):
|
||
if v := strings.TrimSpace(instructionsGPT52); v != "" {
|
||
return instructionsGPT52
|
||
}
|
||
case strings.HasPrefix(m, "gpt-5.1"), strings.HasPrefix(m, "gpt-5"):
|
||
if v := strings.TrimSpace(instructionsGPT51); v != "" {
|
||
return instructionsGPT51
|
||
}
|
||
}
|
||
return DefaultInstructions
|
||
}
|