Two defects that only surface against the real DeepSeek API, both of which break the cost model rather than the code: deepseek-v4-flash enables thinking mode by default. The same single-turn question took 13.5s with it on and 1.8s with it off, and the thinking tokens are billed at the output rate. That misses NFR-PERF-02b (15s per turn) and inflates every conversational call. SceneConfig now carries an explicit `thinking` flag, all four V1 scenes set it to false, and the provider always sends the parameter rather than relying on the upstream default. Reasoning tokens are recorded separately in Usage.tokens_reasoning so the cost of ever turning it back on is visible. DeepSeek moves to peak/off-peak pricing on 2026-08-17, with peak (Beijing 09:00-12:00 and 14:00-18:00) at twice the off-peak rate. Reports are generated mostly during peak hours, so a single blended rate would leave ob_ai_call -- the only input to V2 pricing -- off by nearly a factor of two. PeakAwareRateTable resolves the rate at call time; cost is computed and stored then, never recomputed later at whatever the current rate happens to be. Also here: - Replace the live API key in the redaction test with a synthetic one. The test that proves we redact secrets was itself a secret leak waiting for its first commit. - Correct LLM_COST_RATES_JSON, which held placeholder rates. - Make ids.SnowflakeGenerator take an injectable clock so rollover and clock-rollback are testable without patching a slots class. - Rename exceptions to the -Error suffix (N818) and clear the remaining ruff, mypy and import-linter findings, including two dead lines: a duplicate pytestmark assignment and a no-op assert on a None return. Gates: ruff, mypy (96 files incl. tests), 4/4 import contracts, detect-secrets, 166 unit + 3 integration tests, migration up/down round-trip.
238 lines
5.7 KiB
Plaintext
Executable File
238 lines
5.7 KiB
Plaintext
Executable File
{
|
|
"version": "1.5.0",
|
|
"plugins_used": [
|
|
{
|
|
"name": "ArtifactoryDetector"
|
|
},
|
|
{
|
|
"name": "AWSKeyDetector"
|
|
},
|
|
{
|
|
"name": "AzureStorageKeyDetector"
|
|
},
|
|
{
|
|
"name": "Base64HighEntropyString",
|
|
"limit": 4.5
|
|
},
|
|
{
|
|
"name": "BasicAuthDetector"
|
|
},
|
|
{
|
|
"name": "CloudantDetector"
|
|
},
|
|
{
|
|
"name": "DiscordBotTokenDetector"
|
|
},
|
|
{
|
|
"name": "GitHubTokenDetector"
|
|
},
|
|
{
|
|
"name": "GitLabTokenDetector"
|
|
},
|
|
{
|
|
"name": "HexHighEntropyString",
|
|
"limit": 3.0
|
|
},
|
|
{
|
|
"name": "IbmCloudIamDetector"
|
|
},
|
|
{
|
|
"name": "IbmCosHmacDetector"
|
|
},
|
|
{
|
|
"name": "IPPublicDetector"
|
|
},
|
|
{
|
|
"name": "JwtTokenDetector"
|
|
},
|
|
{
|
|
"name": "KeywordDetector",
|
|
"keyword_exclude": ""
|
|
},
|
|
{
|
|
"name": "MailchimpDetector"
|
|
},
|
|
{
|
|
"name": "NpmDetector"
|
|
},
|
|
{
|
|
"name": "OpenAIDetector"
|
|
},
|
|
{
|
|
"name": "PrivateKeyDetector"
|
|
},
|
|
{
|
|
"name": "PypiTokenDetector"
|
|
},
|
|
{
|
|
"name": "SendGridDetector"
|
|
},
|
|
{
|
|
"name": "SlackDetector"
|
|
},
|
|
{
|
|
"name": "SoftlayerDetector"
|
|
},
|
|
{
|
|
"name": "SquareOAuthDetector"
|
|
},
|
|
{
|
|
"name": "StripeDetector"
|
|
},
|
|
{
|
|
"name": "TelegramBotTokenDetector"
|
|
},
|
|
{
|
|
"name": "TwilioKeyDetector"
|
|
}
|
|
],
|
|
"filters_used": [
|
|
{
|
|
"path": "detect_secrets.filters.allowlist.is_line_allowlisted"
|
|
},
|
|
{
|
|
"path": "detect_secrets.filters.common.is_baseline_file",
|
|
"filename": ".secrets.baseline"
|
|
},
|
|
{
|
|
"path": "detect_secrets.filters.common.is_ignored_due_to_verification_policies",
|
|
"min_level": 2
|
|
},
|
|
{
|
|
"path": "detect_secrets.filters.heuristic.is_indirect_reference"
|
|
},
|
|
{
|
|
"path": "detect_secrets.filters.heuristic.is_likely_id_string"
|
|
},
|
|
{
|
|
"path": "detect_secrets.filters.heuristic.is_lock_file"
|
|
},
|
|
{
|
|
"path": "detect_secrets.filters.heuristic.is_not_alphanumeric_string"
|
|
},
|
|
{
|
|
"path": "detect_secrets.filters.heuristic.is_potential_uuid"
|
|
},
|
|
{
|
|
"path": "detect_secrets.filters.heuristic.is_prefixed_with_dollar_sign"
|
|
},
|
|
{
|
|
"path": "detect_secrets.filters.heuristic.is_sequential_string"
|
|
},
|
|
{
|
|
"path": "detect_secrets.filters.heuristic.is_swagger_file"
|
|
},
|
|
{
|
|
"path": "detect_secrets.filters.heuristic.is_templated_secret"
|
|
}
|
|
],
|
|
"results": {
|
|
".env.example": [
|
|
{
|
|
"type": "Basic Auth Credentials",
|
|
"filename": ".env.example",
|
|
"hashed_secret": "5b0c72b82d7a4f2d7021527f86ab0bed290b9604",
|
|
"is_verified": false,
|
|
"line_number": 15
|
|
}
|
|
],
|
|
".github/workflows/ci.yml": [
|
|
{
|
|
"type": "Secret Keyword",
|
|
"filename": ".github/workflows/ci.yml",
|
|
"hashed_secret": "5b0c72b82d7a4f2d7021527f86ab0bed290b9604",
|
|
"is_verified": false,
|
|
"line_number": 28
|
|
},
|
|
{
|
|
"type": "Secret Keyword",
|
|
"filename": ".github/workflows/ci.yml",
|
|
"hashed_secret": "0454753c5b5d78d5b1602b790450c2c4722e109c",
|
|
"is_verified": false,
|
|
"line_number": 47
|
|
},
|
|
{
|
|
"type": "Basic Auth Credentials",
|
|
"filename": ".github/workflows/ci.yml",
|
|
"hashed_secret": "5b0c72b82d7a4f2d7021527f86ab0bed290b9604",
|
|
"is_verified": false,
|
|
"line_number": 48
|
|
},
|
|
{
|
|
"type": "Secret Keyword",
|
|
"filename": ".github/workflows/ci.yml",
|
|
"hashed_secret": "291cae9c7abc43bb36c3fcec27775787977ecbe7",
|
|
"is_verified": false,
|
|
"line_number": 52
|
|
}
|
|
],
|
|
"deploy/docker-compose.dev.yml": [
|
|
{
|
|
"type": "Secret Keyword",
|
|
"filename": "deploy/docker-compose.dev.yml",
|
|
"hashed_secret": "5b0c72b82d7a4f2d7021527f86ab0bed290b9604",
|
|
"is_verified": false,
|
|
"line_number": 14
|
|
},
|
|
{
|
|
"type": "Basic Auth Credentials",
|
|
"filename": "deploy/docker-compose.dev.yml",
|
|
"hashed_secret": "5b0c72b82d7a4f2d7021527f86ab0bed290b9604",
|
|
"is_verified": false,
|
|
"line_number": 51
|
|
}
|
|
],
|
|
"packages/shared/config.py": [
|
|
{
|
|
"type": "Secret Keyword",
|
|
"filename": "packages/shared/config.py",
|
|
"hashed_secret": "9b0fa95ea79b52c1ed98ded789d79eaca61144db",
|
|
"is_verified": false,
|
|
"line_number": 20
|
|
},
|
|
{
|
|
"type": "Basic Auth Credentials",
|
|
"filename": "packages/shared/config.py",
|
|
"hashed_secret": "5b0c72b82d7a4f2d7021527f86ab0bed290b9604",
|
|
"is_verified": false,
|
|
"line_number": 43
|
|
}
|
|
],
|
|
"tests/conftest.py": [
|
|
{
|
|
"type": "Secret Keyword",
|
|
"filename": "tests/conftest.py",
|
|
"hashed_secret": "54391aaa964c71a817e17e42a523ffbe7c75f0b6",
|
|
"is_verified": false,
|
|
"line_number": 20
|
|
},
|
|
{
|
|
"type": "Secret Keyword",
|
|
"filename": "tests/conftest.py",
|
|
"hashed_secret": "cf2f6537b575e33aa209a982172c4253835eee83",
|
|
"is_verified": false,
|
|
"line_number": 21
|
|
}
|
|
],
|
|
"tests/unit/test_deepseek_provider.py": [
|
|
{
|
|
"type": "Secret Keyword",
|
|
"filename": "tests/unit/test_deepseek_provider.py",
|
|
"hashed_secret": "3acfb2c2b433c0ea7ff107e33df91b18e52f960f",
|
|
"is_verified": false,
|
|
"line_number": 42
|
|
}
|
|
],
|
|
"tests/unit/test_log_redaction.py": [
|
|
{
|
|
"type": "Secret Keyword",
|
|
"filename": "tests/unit/test_log_redaction.py",
|
|
"hashed_secret": "7ce6ed3727ece51d2219f2bdc7f6db3594dc4d7f",
|
|
"is_verified": false,
|
|
"line_number": 49
|
|
}
|
|
]
|
|
},
|
|
"generated_at": "2026-08-13T16:53:15Z"
|
|
}
|