3a28d2612a
feat(ai/gateway): structured-output opt-in + capability-aware expansion fallback ( #2372 ) ( #2373 )
...
* fix(gateway): constrain query expansion JSON key to "queries"
The expansion prompt asks the model to "Rewrite the search query below
into 3-4 different, related queries" without naming the JSON key.
On OpenAI-compatible endpoints that don't enforce a strict JSON schema
server-side (e.g. DeepSeek, many self-hosted gateways), the model
picks the prompt-salient noun and emits {"rewrites": [...]}, which
fails ExpansionSchema ({ queries: string[] }) validation. The catch
block only warns for AIConfigError, so the schema-validation failure
silently falls back to [query] and expansion is effectively disabled.
Verified on two providers: oMLX serving Qwen3.6-35B-A3B-6bit at
http://127.0.0.1:8888/v1 and deepseek-v4-flash at
https://api.deepseek.com/v1 . With the prompt constraint, both return
{"queries": [...]} and gbrain query latency increases by ~150 ms
(the expansion inference), confirming expansion now runs end-to-end.
Refs #1156
(cherry picked from commit 132973039c )
* fix(gateway): expand() falls back to generateText for openai-compat providers
generateObject() with a Zod schema uses the response_format
json_schema mode, which most openai-compatible providers do not
support. When the provider rejects structured outputs, the expansion
silently returns only the original query — no error, no log, just
degraded retrieval quality.
For openai-compatible recipes, use generateText() with a JSON prompt
and parse the response manually. Native providers (Anthropic, OpenAI,
Google) keep the existing generateObject() path. This fixes silent
expansion failure for all openai-compatible providers: Zhipu/GLM,
DeepSeek, Groq, Together, Ollama, and any future recipe using the
openai-compatible implementation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
(cherry picked from commit 0e271961c0 )
* refactor(ai): lift parseLlmJson into a leaf util
parseLlmJson lived in conversation-parser/llm-base.ts, which imports chat from the gateway. The gateway needs the same tolerant decoder for its expansion fallback, so importing it back would create a dependency cycle and pull the conversation-parser base into the gateway's module graph.
Move the function to src/core/llm-json.ts, a leaf with no provider or gateway imports, and re-export it from llm-base.ts so existing importers (llm-fallback, llm-polish) and its test keep their import path unchanged. Behavior-preserving.
* feat(ai/gateway): structured-output opt-in + capability-aware expansion fallback
Unifies two cherry-picked fixes (preserved in this branch's history) under a single capability flag and one expand() path:
- #1158 (im4saken): names the required "queries" key in the expansion prompt.
- #1618 (punksterlabs): falls back to generateText for openai-compatible providers.
Adds ChatTouchpoint.supports_structured_outputs (default false) and threads it into createOpenAICompatible's supportsStructuredOutputs at the chat and expansion build sites via recipeSupportsStructuredOutputs().
expand() now routes three ways:
- Native providers (Anthropic, OpenAI, Google) use generateObject unchanged.
- openai-compatible recipes that opt into structured outputs request a strict json_schema and fall back to the text path if it is rejected at call time, so a mis-declared capability never drops expansion.
- Every other openai-compatible recipe skips the json_schema attempt and parses the model's text directly, which removes the AI SDK warning and the silent degradation.
parseExpansionResponse() recovers the queries through a tolerant JSON decode plus schema validation, replacing the inline regex parse.
Net: fixes the silent expansion failure for every openai-compatible backend (the #1618 case), keeps the named-key prompt (closes the gap in #1156 that #1158 addresses), and adds strict structured outputs for backends that support them, which the always-generateText approach cannot reach.
Tests: capability gating across recipes plus a synthetic opt-in recipe; schemaless recovery from clean, fenced, and prose-wrapped JSON; null on non-JSON and schema-violating output.
---------
Co-authored-by: im4saken <280051114+im4saken@users.noreply.github.com >
Co-authored-by: Allwin Agnel <allwin.agnel@gmail.com >
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
Co-authored-by: Garry Tan <garrytan@gmail.com >
2026-07-27 16:43:09 -07:00
..
2026-07-27 16:43:09 -07:00
2026-07-20 23:07:58 -07:00
2026-05-24 21:50:08 -07:00
2026-07-23 15:29:09 -07:00
2026-05-24 09:30:57 -07:00
2026-05-14 19:13:14 -07:00
2026-07-23 13:23:36 -07:00
2026-06-14 09:32:58 -07:00
2026-07-24 11:36:01 -07:00
2026-07-23 18:01:07 -07:00
2026-07-24 11:50:48 -07:00
2026-07-27 14:17:06 -07:00
2026-06-01 22:13:19 -07:00
2026-06-03 07:09:20 -07:00
2026-07-02 10:48:54 -07:00
2026-07-23 17:28:51 -07:00
2026-07-24 11:35:54 -07:00
2026-05-20 20:25:41 -07:00
2026-07-20 23:07:58 -07:00
2026-07-20 13:56:00 -07:00
2026-07-23 13:53:11 -07:00
2026-05-26 17:31:48 -07:00
2026-05-22 22:37:15 -07:00
2026-05-27 08:27:05 -07:00
2026-07-23 18:48:34 -07:00
2026-07-23 18:35:13 -07:00
2026-07-22 00:23:10 -07:00
2026-06-07 08:12:50 -07:00
2026-05-22 13:38:07 -07:00
2026-05-22 09:10:20 -07:00
2026-05-18 20:55:57 -07:00
2026-07-17 11:32:12 -07:00
2026-06-16 22:45:22 -07:00
2026-06-16 22:45:22 -07:00
2026-06-16 22:45:22 -07:00
2026-07-23 13:07:08 -07:00
2026-06-21 06:36:43 -07:00
2026-04-29 23:46:36 -07:00
2026-05-07 21:52:58 -07:00
2026-07-27 13:28:37 -07:00
2026-06-03 23:00:11 -07:00
2026-05-18 20:55:57 -07:00
2026-07-23 18:34:59 -07:00
2026-05-02 08:41:11 -07:00
2026-05-22 13:38:07 -07:00
2026-05-18 21:11:02 -07:00
2026-07-23 12:26:33 -07:00
2026-05-11 22:54:35 -07:00
2026-05-23 08:49:28 -07:00
2026-06-01 19:09:15 -07:00
2026-07-17 11:32:06 -07:00
2026-07-23 17:28:47 -07:00
2026-07-23 14:21:34 -07:00
2026-05-18 20:55:57 -07:00
2026-05-22 21:04:30 -07:00
2026-06-21 06:36:43 -07:00
2026-06-21 06:36:43 -07:00
2026-06-21 06:36:43 -07:00
2026-07-24 12:11:15 -07:00
2026-05-22 21:04:30 -07:00
2026-07-23 18:01:07 -07:00
2026-07-27 14:11:05 -07:00
2026-05-21 08:29:55 -07:00
2026-07-16 19:53:10 -07:00
2026-07-23 12:26:33 -07:00
2026-07-23 12:26:33 -07:00
2026-05-21 08:29:55 -07:00
2026-04-21 18:35:45 -07:00
2026-06-03 06:20:03 -07:00
2026-07-23 14:47:11 -07:00
2026-06-01 22:01:14 -07:00
2026-05-08 13:25:48 -07:00
2026-05-08 13:25:48 -07:00
2026-05-25 14:56:38 -07:00
2026-07-22 18:46:58 -07:00
2026-07-23 12:03:16 -07:00
2026-04-14 19:41:34 -10:00
2026-05-18 21:11:02 -07:00
2026-05-27 07:16:30 -07:00
2026-05-24 21:50:08 -07:00
2026-04-22 01:34:22 -07:00
2026-05-14 19:13:14 -07:00
2026-05-14 19:13:14 -07:00
2026-05-07 21:52:58 -07:00
2026-06-03 06:20:03 -07:00
2026-05-14 20:15:29 -07:00
2026-07-13 00:08:36 -07:00
2026-07-17 15:01:27 -07:00
2026-07-17 14:41:25 -07:00
2026-05-10 20:50:40 -07:00
2026-06-17 06:41:37 -07:00
2026-05-02 22:01:05 -07:00
2026-07-23 13:07:08 -07:00
2026-07-23 14:21:51 -07:00
2026-07-20 11:08:41 -07:00
2026-07-17 14:41:25 -07:00
2026-07-23 14:21:39 -07:00
2026-05-22 21:18:09 -07:00
2026-05-22 11:53:11 -07:00
2026-05-24 11:37:03 -07:00
2026-06-03 05:50:21 -07:00
2026-05-25 14:56:38 -07:00
2026-06-07 22:05:31 -07:00
2026-07-23 12:03:26 -07:00
2026-07-23 12:03:26 -07:00
2026-05-22 13:38:07 -07:00
2026-07-23 13:23:36 -07:00
2026-05-22 21:18:09 -07:00
2026-04-25 12:25:34 -07:00
2026-06-24 06:05:16 -07:00
2026-05-25 20:00:03 -07:00
2026-05-25 13:58:26 -07:00
2026-07-22 14:13:54 -07:00
2026-05-24 09:30:57 -07:00
2026-07-27 13:29:07 -07:00
2026-07-27 13:29:07 -07:00
2026-06-21 06:36:43 -07:00
2026-07-02 10:48:54 -07:00
2026-07-02 10:48:54 -07:00
2026-07-02 10:48:54 -07:00
2026-07-02 10:48:54 -07:00
2026-07-02 10:48:54 -07:00
2026-07-02 10:48:54 -07:00
2026-07-17 15:01:27 -07:00
2026-07-02 10:48:54 -07:00
2026-07-02 10:48:54 -07:00
2026-07-02 10:48:54 -07:00
2026-07-21 00:04:41 -07:00
2026-04-25 12:25:34 -07:00
2026-05-14 19:13:14 -07:00
2026-04-25 12:25:34 -07:00
2026-07-20 23:47:09 -07:00
2026-05-11 22:54:35 -07:00
2026-07-23 18:00:56 -07:00
2026-04-29 23:46:36 -07:00
2026-05-18 20:55:57 -07:00
2026-07-16 21:20:12 -07:00
2026-07-20 11:25:46 -07:00
2026-05-25 19:53:59 -07:00
2026-06-14 09:32:58 -07:00
2026-07-20 13:00:16 -07:00
2026-06-12 07:28:13 -07:00
2026-06-14 09:32:58 -07:00
2026-07-20 14:27:50 -07:00
2026-07-22 18:46:39 -07:00
2026-05-23 10:01:08 -07:00
2026-06-14 09:32:58 -07:00
2026-05-02 08:41:11 -07:00
2026-05-07 10:03:38 -07:00
2026-05-30 12:07:38 -07:00
2026-06-14 09:32:58 -07:00
2026-05-25 20:00:03 -07:00
2026-04-25 12:25:34 -07:00
2026-05-30 14:58:40 -07:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-06-03 06:43:11 -07:00
2026-05-14 19:50:50 -04:00
2026-05-30 14:58:40 -07:00
2026-05-13 13:14:58 -04:00
2026-05-19 13:12:40 -07:00
2026-06-12 06:05:34 -07:00
2026-05-09 22:58:19 -07:00
2026-07-17 11:27:34 -07:00
2026-07-27 13:55:41 -07:00
2026-05-13 13:14:58 -04:00
2026-07-16 16:27:22 -07:00
2026-06-01 19:09:15 -07:00
2026-07-23 13:23:36 -07:00
2026-07-17 11:32:23 -07:00
2026-05-23 10:57:32 -07:00
2026-05-18 21:11:02 -07:00
2026-05-24 10:49:56 -07:00
2026-06-07 19:22:33 -07:00
2026-07-23 12:42:56 -07:00
2026-05-23 08:49:28 -07:00
2026-05-23 08:49:28 -07:00
2026-07-23 18:35:05 -07:00
2026-07-20 16:57:53 -07:00
2026-05-30 10:30:56 -07:00
2026-07-16 21:20:12 -07:00
2026-07-23 12:26:33 -07:00
2026-05-06 20:39:56 -07:00
2026-05-06 20:39:56 -07:00
2026-05-06 20:39:56 -07:00
2026-05-21 22:11:00 -07:00
2026-07-16 16:57:55 -07:00
2026-05-19 17:14:53 -07:00
2026-07-21 13:21:51 -07:00
2026-06-09 22:28:44 -07:00
2026-07-23 12:13:50 -07:00
2026-07-27 15:11:45 -07:00
2026-07-17 11:36:43 -07:00
2026-05-27 06:30:46 -07:00
2026-05-23 18:43:10 -07:00
2026-05-22 21:04:30 -07:00
2026-05-24 22:56:21 -07:00
2026-07-27 14:11:36 -07:00
2026-07-20 13:56:00 -07:00
2026-07-27 14:11:36 -07:00
2026-05-22 21:04:30 -07:00
2026-05-25 12:48:55 -07:00
2026-05-25 14:56:38 -07:00
2026-05-09 20:46:34 -07:00
2026-07-27 13:29:37 -07:00
2026-07-17 14:25:48 -07:00
2026-05-27 08:52:36 -07:00
2026-04-14 19:41:34 -10:00
2026-05-28 19:04:48 -07:00
2026-06-03 06:43:11 -07:00
2026-05-24 11:37:03 -07:00
2026-06-09 22:28:44 -07:00
2026-06-21 06:36:43 -07:00
2026-05-23 10:21:59 -07:00
2026-06-09 22:28:44 -07:00
2026-05-08 13:25:48 -07:00
2026-06-17 06:58:07 -07:00
2026-04-22 16:24:23 -07:00
2026-07-27 14:16:05 -07:00
2026-04-29 22:21:07 -07:00
2026-05-22 13:38:07 -07:00
2026-06-21 06:36:43 -07:00
2026-05-26 23:15:44 -07:00
2026-05-23 18:43:10 -07:00
2026-05-26 23:47:05 -07:00
2026-07-23 12:03:26 -07:00
2026-07-23 12:03:06 -07:00
2026-06-03 07:27:34 -07:00
2026-05-18 20:55:57 -07:00
2026-05-23 18:43:10 -07:00
2026-07-24 12:27:56 -07:00
2026-05-22 21:04:30 -07:00
2026-05-22 21:04:30 -07:00
2026-07-17 11:27:34 -07:00
2026-05-25 15:10:23 -07:00
2026-07-23 13:23:36 -07:00
2026-05-27 08:27:05 -07:00
2026-06-14 09:32:58 -07:00
2026-04-20 21:54:36 +08:00
2026-05-22 09:29:59 -07:00
2026-07-16 16:26:46 -07:00
2026-05-26 23:47:05 -07:00
2026-06-01 22:28:20 -07:00
2026-04-26 15:49:48 -07:00
2026-07-23 14:33:02 -07:00
2026-07-23 12:26:33 -07:00
2026-06-03 07:27:34 -07:00
2026-07-23 17:28:51 -07:00
2026-07-23 17:43:00 -07:00
2026-05-21 22:11:00 -07:00
2026-05-21 18:57:05 -07:00
2026-07-16 20:49:28 -07:00
2026-05-26 23:47:05 -07:00
2026-05-13 13:14:58 -04:00
2026-06-03 06:20:03 -07:00
2026-07-27 14:16:05 -07:00
2026-05-24 11:37:03 -07:00
2026-05-27 06:30:46 -07:00
2026-07-23 11:24:55 -07:00
2026-05-21 08:29:55 -07:00
2026-05-26 17:31:48 -07:00
2026-07-23 11:24:30 -07:00
2026-06-03 07:27:34 -07:00
2026-06-17 14:02:47 -07:00
2026-07-27 14:14:34 -07:00
2026-05-24 22:56:21 -07:00
2026-07-21 12:29:35 -07:00
2026-07-27 15:11:45 -07:00
2026-05-30 14:58:40 -07:00
2026-07-23 14:47:11 -07:00
2026-05-13 13:14:58 -04:00
2026-04-20 21:54:36 +08:00
2026-06-17 06:41:37 -07:00
2026-05-14 19:13:14 -07:00
2026-05-07 21:52:58 -07:00
2026-06-16 15:08:47 -07:00
2026-06-07 08:12:50 -07:00
2026-06-12 06:05:34 -07:00
2026-05-19 17:14:53 -07:00
2026-07-10 10:05:23 +09:00
2026-05-24 10:49:56 -07:00
2026-07-20 22:14:46 -07:00
2026-07-21 18:13:45 -07:00
2026-05-23 08:49:28 -07:00
2026-07-23 12:13:42 -07:00
2026-07-10 10:05:23 +09:00
2026-07-27 14:12:38 -07:00
2026-05-15 18:54:36 -07:00
2026-05-30 10:30:56 -07:00
2026-07-23 12:03:26 -07:00
2026-04-11 00:01:09 -10:00
2026-07-10 10:05:23 +09:00
2026-05-22 22:37:15 -07:00
2026-05-27 07:01:28 -07:00
2026-05-07 10:03:38 -07:00
2026-05-10 06:34:40 -07:00
2026-06-01 22:13:19 -07:00
2026-05-22 13:38:07 -07:00
2026-04-14 19:41:34 -10:00
2026-07-23 13:38:52 -07:00
2026-05-17 08:51:33 -07:00
2026-07-13 00:09:04 -07:00
2026-05-24 11:37:03 -07:00
2026-04-25 12:25:34 -07:00
2026-05-01 09:02:43 -07:00
2026-06-12 07:28:13 -07:00
2026-05-01 09:02:43 -07:00
2026-05-01 09:02:43 -07:00
2026-07-02 10:48:54 -07:00
2026-05-13 13:14:58 -04:00
2026-05-17 08:32:03 -07:00
2026-05-17 08:32:03 -07:00
2026-07-16 21:20:12 -07:00
2026-05-11 22:42:54 -07:00
2026-05-17 08:32:03 -07:00
2026-05-11 22:42:54 -07:00
2026-05-17 08:32:03 -07:00
2026-05-17 08:32:03 -07:00
2026-05-17 08:32:03 -07:00
2026-05-11 22:42:54 -07:00
2026-05-17 08:32:03 -07:00
2026-05-11 22:42:54 -07:00
2026-07-27 13:46:43 -07:00
2026-05-17 08:32:03 -07:00
2026-05-17 08:32:03 -07:00
2026-05-17 08:32:03 -07:00
2026-05-26 17:31:48 -07:00
2026-05-26 18:29:03 -07:00
2026-05-01 09:02:43 -07:00
2026-05-24 21:50:08 -07:00
2026-05-25 15:46:25 -07:00
2026-05-25 15:46:25 -07:00
2026-05-01 09:02:43 -07:00
2026-05-22 22:16:25 -07:00
2026-05-24 21:50:08 -07:00
2026-05-01 09:02:43 -07:00
2026-05-30 12:07:38 -07:00
2026-05-13 13:14:58 -04:00
2026-05-22 13:38:07 -07:00
2026-05-10 06:34:40 -07:00
2026-06-03 07:09:20 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-07-27 13:28:37 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-05-17 18:52:38 -07:00
2026-05-24 22:56:21 -07:00
2026-05-12 14:33:29 -07:00
2026-04-13 21:03:40 -10:00
2026-05-17 14:27:31 -07:00
2026-05-22 13:38:07 -07:00
2026-06-09 22:28:44 -07:00
2026-06-03 07:27:34 -07:00
2026-07-24 11:37:05 -07:00
2026-07-16 19:52:57 -07:00
2026-07-24 11:37:05 -07:00
2026-05-27 06:30:46 -07:00
2026-05-25 14:56:38 -07:00
2026-05-26 18:29:03 -07:00
2026-07-24 12:27:56 -07:00
2026-05-02 22:01:05 -07:00
2026-07-23 18:15:24 -07:00
2026-05-11 19:25:48 -07:00
2026-07-17 11:36:43 -07:00
2026-06-02 16:33:06 -07:00
2026-07-23 16:45:27 -07:00
2026-05-21 08:29:55 -07:00
2026-07-23 11:24:45 -07:00
2026-07-16 19:53:16 -07:00
2026-05-10 06:34:40 -07:00
2026-07-20 15:05:32 -07:00
2026-05-06 21:14:34 -07:00
2026-05-26 18:29:03 -07:00
2026-07-23 16:45:27 -07:00
2026-05-25 15:21:59 -07:00
2026-05-27 08:27:05 -07:00
2026-05-22 21:18:09 -07:00
2026-05-30 12:07:38 -07:00
2026-05-31 08:20:25 -07:00
2026-05-10 12:49:14 -07:00
2026-05-17 08:51:33 -07:00
2026-05-09 16:57:47 -07:00
2026-05-10 12:49:14 -07:00
2026-05-09 16:57:47 -07:00
2026-05-10 12:49:14 -07:00
2026-05-09 16:57:47 -07:00
2026-05-10 12:49:14 -07:00
2026-07-24 12:27:48 -07:00
2026-07-10 10:05:23 +09:00
2026-05-10 12:49:14 -07:00
2026-07-17 14:25:48 -07:00
2026-05-10 12:49:14 -07:00
2026-05-17 18:52:38 -07:00
2026-07-13 00:09:16 -07:00
2026-05-11 19:25:48 -07:00
2026-05-09 16:57:47 -07:00
2026-07-23 12:13:42 -07:00
2026-05-09 16:57:47 -07:00
2026-05-28 19:04:48 -07:00
2026-05-09 16:57:47 -07:00
2026-05-09 16:57:47 -07:00
2026-06-12 06:05:34 -07:00
2026-05-09 16:57:47 -07:00
2026-07-23 13:38:33 -07:00
2026-05-09 16:57:47 -07:00
2026-04-20 07:30:00 +08:00
2026-05-23 10:21:59 -07:00
2026-04-14 21:40:48 -10:00
2026-07-16 16:26:43 -07:00
2026-05-17 08:51:33 -07:00
2026-04-09 10:17:13 -07:00
2026-04-13 07:49:13 -10:00
2026-04-16 23:03:15 -07:00
2026-07-16 16:27:16 -07:00
2026-04-23 19:34:27 -07:00
2026-05-25 14:20:19 -07:00
2026-06-14 09:32:58 -07:00
2026-06-12 07:28:13 -07:00
2026-07-20 16:47:12 -07:00
2026-05-22 22:37:15 -07:00
2026-04-29 23:46:36 -07:00
2026-04-29 23:46:36 -07:00
2026-05-18 20:55:57 -07:00
2026-05-21 09:26:37 -07:00
2026-06-08 21:19:25 -07:00
2026-06-08 21:19:25 -07:00
2026-07-24 11:50:22 -07:00
2026-07-20 15:51:16 -07:00
2026-07-17 15:23:47 -07:00
2026-05-18 21:26:12 -07:00
2026-07-16 16:31:53 -07:00
2026-07-21 13:06:32 -07:00
2026-07-20 23:07:58 -07:00
2026-06-03 06:20:03 -07:00
2026-06-16 22:32:38 -07:00
2026-06-21 06:36:43 -07:00
2026-07-16 20:47:44 -07:00
2026-06-17 06:41:37 -07:00
2026-05-17 08:00:29 -07:00
2026-05-18 19:34:44 -07:00
2026-05-18 19:34:44 -07:00
2026-05-21 08:29:55 -07:00
2026-05-18 19:34:44 -07:00
2026-05-30 12:34:43 -07:00
2026-07-20 13:56:00 -07:00
2026-07-21 13:21:51 -07:00
2026-05-25 09:57:30 -07:00
2026-07-20 11:49:47 -07:00
2026-05-25 15:46:25 -07:00
2026-07-24 11:50:27 -07:00
2026-07-20 11:49:47 -07:00
2026-07-17 14:17:37 -07:00
2026-06-12 06:05:34 -07:00
2026-05-25 19:53:59 -07:00
2026-06-01 23:03:09 -07:00
2026-07-23 12:57:37 -07:00
2026-07-27 13:45:45 -07:00
2026-07-16 16:31:50 -07:00
2026-07-17 11:32:42 -07:00
2026-07-17 14:17:37 -07:00
2026-05-30 10:30:56 -07:00
2026-05-21 08:29:55 -07:00
2026-04-12 07:48:47 -10:00
2026-04-25 12:25:34 -07:00
2026-07-02 10:48:54 -07:00
2026-06-03 06:43:11 -07:00
2026-07-23 12:14:14 -07:00
2026-05-07 22:56:22 -07:00
2026-07-23 17:43:06 -07:00
2026-05-13 13:14:58 -04:00
2026-05-21 18:57:05 -07:00
2026-05-11 19:25:48 -07:00
2026-06-10 21:12:33 -07:00
2026-07-23 13:23:36 -07:00
2026-04-22 01:34:22 -07:00
2026-05-13 13:14:58 -04:00
2026-05-30 14:58:40 -07:00
2026-06-03 15:24:00 -07:00
2026-06-03 07:09:20 -07:00
2026-05-24 11:37:03 -07:00
2026-04-25 12:25:34 -07:00
2026-05-25 14:20:19 -07:00
2026-05-24 11:37:03 -07:00
2026-06-08 21:19:25 -07:00
2026-07-23 16:13:51 -07:00
2026-05-21 18:57:05 -07:00
2026-04-25 12:25:34 -07:00
2026-07-24 12:27:41 -07:00
2026-05-22 13:38:07 -07:00
2026-06-07 19:12:50 -07:00
2026-06-10 22:00:36 -07:00
2026-06-01 23:03:09 -07:00
2026-04-26 20:45:05 -07:00
2026-06-01 22:01:14 -07:00
2026-07-23 13:09:42 -07:00
2026-07-27 14:16:05 -07:00
2026-07-24 11:50:37 -07:00
2026-07-24 12:41:26 -07:00
2026-05-19 17:14:53 -07:00
2026-05-22 09:10:20 -07:00
2026-07-22 18:46:39 -07:00
2026-07-27 14:16:05 -07:00
2026-05-22 22:37:15 -07:00
2026-05-22 22:37:15 -07:00
2026-05-07 19:49:46 -07:00
2026-05-24 09:30:57 -07:00
2026-07-21 19:52:18 -07:00
2026-05-22 08:00:42 -07:00
2026-07-17 11:39:15 -07:00
2026-07-23 12:03:01 -07:00
2026-05-09 19:47:56 -07:00
2026-05-07 22:56:22 -07:00
2026-05-04 21:11:15 -07:00
2026-05-30 12:07:38 -07:00
2026-05-17 08:00:29 -07:00
2026-05-13 13:14:58 -04:00
2026-07-23 14:21:56 -07:00
2026-07-13 00:08:52 -07:00
2026-05-08 13:25:48 -07:00
2026-05-25 14:43:12 -07:00
2026-07-20 10:33:27 -07:00
2026-07-23 13:53:15 -07:00
2026-07-27 14:14:03 -07:00
2026-04-26 20:45:05 -07:00
2026-05-10 12:49:14 -07:00
2026-05-09 20:46:34 -07:00
2026-05-09 20:46:34 -07:00
2026-07-02 08:00:58 -07:00
2026-05-11 22:54:35 -07:00
2026-04-18 16:57:38 +08:00
2026-04-18 16:57:38 +08:00
2026-04-18 18:16:18 +08:00
2026-04-19 07:14:24 +08:00
2026-05-30 14:56:26 -07:00
2026-05-30 14:56:26 -07:00
2026-04-20 07:30:00 +08:00
2026-04-29 23:46:36 -07:00
2026-05-30 14:56:26 -07:00
2026-04-25 12:25:34 -07:00
2026-04-25 12:25:34 -07:00
2026-05-22 09:29:59 -07:00
2026-05-07 10:03:38 -07:00
2026-07-23 12:26:28 -07:00
2026-05-10 06:34:40 -07:00
2026-05-24 22:56:21 -07:00
2026-05-26 17:31:48 -07:00
2026-05-24 11:37:03 -07:00
2026-04-22 01:34:22 -07:00
2026-05-19 13:12:40 -07:00
2026-05-19 13:12:40 -07:00
2026-05-19 13:12:40 -07:00
2026-07-20 13:56:00 -07:00
2026-07-23 18:17:14 -07:00
2026-05-23 08:49:28 -07:00
2026-05-27 07:16:30 -07:00
2026-06-01 21:54:13 -07:00
2026-07-27 13:28:37 -07:00
2026-05-25 10:39:09 -07:00
2026-05-25 10:39:09 -07:00
2026-05-02 22:01:05 -07:00
2026-05-23 08:49:28 -07:00
2026-05-10 13:33:05 -07:00
2026-05-03 20:41:39 -07:00
2026-06-03 15:24:00 -07:00
2026-07-23 12:26:33 -07:00
2026-07-23 12:26:33 -07:00
2026-05-10 12:49:14 -07:00
2026-07-16 21:20:12 -07:00
2026-06-12 06:05:34 -07:00
2026-05-25 09:57:30 -07:00
2026-05-09 19:47:56 -07:00
2026-07-23 17:28:42 -07:00
2026-07-27 14:15:35 -07:00
2026-05-27 06:30:46 -07:00
2026-06-17 14:02:47 -07:00
2026-05-18 21:11:02 -07:00
2026-07-22 01:32:11 -07:00
2026-07-24 12:27:48 -07:00
2026-05-14 19:13:14 -07:00
2026-04-30 01:23:29 -07:00
2026-05-30 13:11:25 -07:00
2026-05-18 21:26:12 -07:00
2026-05-25 15:10:23 -07:00
2026-05-25 19:53:59 -07:00
2026-07-23 16:13:51 -07:00
2026-05-23 18:43:10 -07:00
2026-07-23 14:33:02 -07:00
2026-05-29 07:06:08 -07:00
2026-07-21 19:52:18 -07:00
2026-07-23 12:03:26 -07:00
2026-06-17 06:58:07 -07:00
2026-06-17 14:02:47 -07:00
2026-05-06 21:14:34 -07:00
2026-07-20 15:51:16 -07:00
2026-05-22 13:38:07 -07:00
2026-05-03 20:41:39 -07:00
2026-05-23 10:21:59 -07:00
2026-04-25 12:25:34 -07:00
2026-04-08 23:26:11 -10:00
2026-07-02 08:00:58 -07:00
2026-05-09 20:46:34 -07:00
2026-06-12 07:28:13 -07:00
2026-07-23 18:35:09 -07:00
2026-07-16 21:20:10 -07:00
2026-07-23 18:35:22 -07:00
2026-06-12 06:05:34 -07:00
2026-05-26 18:29:03 -07:00
2026-05-18 06:22:12 -07:00
2026-06-09 22:28:44 -07:00
2026-07-23 18:15:24 -07:00
2026-07-23 17:28:47 -07:00
2026-04-23 19:34:27 -07:00
2026-06-16 22:45:22 -07:00
2026-04-20 07:30:00 +08:00
2026-06-09 22:28:44 -07:00
2026-07-17 14:18:52 -07:00
2026-06-03 08:59:39 -07:00
2026-07-17 15:15:10 -07:00
2026-06-09 22:28:44 -07:00
2026-07-17 15:15:10 -07:00
2026-06-03 22:40:12 -07:00
2026-05-09 20:46:34 -07:00
2026-05-25 13:15:11 -07:00
2026-05-11 19:25:48 -07:00
2026-05-25 14:43:12 -07:00
2026-06-03 08:00:57 -07:00
2026-06-03 08:00:57 -07:00
2026-04-29 23:46:36 -07:00
2026-07-22 13:41:32 -07:00
2026-07-23 17:12:57 -07:00
2026-07-24 11:50:32 -07:00
2026-07-21 12:17:18 -07:00
2026-05-21 18:57:05 -07:00
2026-07-27 14:15:05 -07:00
2026-04-12 13:23:55 -10:00
2026-07-23 11:24:40 -07:00
2026-05-14 19:13:14 -07:00
2026-05-28 19:04:48 -07:00
2026-04-25 12:25:34 -07:00
2026-06-01 23:03:09 -07:00
2026-06-01 23:03:09 -07:00
2026-06-17 14:02:47 -07:00
2026-07-16 16:57:55 -07:00
2026-05-18 21:11:02 -07:00
2026-05-07 10:03:38 -07:00
2026-05-07 21:52:58 -07:00
2026-05-07 21:52:58 -07:00
2026-04-16 23:03:15 -07:00
2026-04-22 01:34:22 -07:00
2026-06-03 14:14:13 -07:00
2026-06-03 22:40:12 -07:00
2026-05-24 11:37:03 -07:00
2026-04-22 01:34:22 -07:00
2026-05-24 00:00:39 -07:00
2026-05-11 23:20:17 -07:00
2026-07-16 21:20:12 -07:00
2026-05-11 23:20:17 -07:00
2026-05-07 21:52:58 -07:00
2026-05-07 21:52:58 -07:00
2026-07-20 23:23:03 -07:00
2026-05-03 20:16:15 -07:00
2026-05-30 14:56:26 -07:00
2026-05-22 21:04:30 -07:00
2026-04-23 19:34:27 -07:00
2026-05-22 11:53:11 -07:00
2026-05-21 08:59:29 -07:00
2026-05-21 08:59:29 -07:00
2026-05-21 08:59:29 -07:00
2026-06-03 07:09:20 -07:00
2026-05-21 08:29:55 -07:00
2026-05-30 14:56:26 -07:00
2026-07-17 15:23:47 -07:00
2026-05-23 08:49:28 -07:00
2026-06-07 22:05:31 -07:00
2026-06-07 22:05:31 -07:00
2026-06-07 22:05:31 -07:00
2026-06-07 22:05:31 -07:00
2026-07-23 12:26:43 -07:00
2026-07-24 12:11:29 -07:00
2026-05-23 08:49:28 -07:00
2026-07-20 11:16:21 -07:00
2026-04-19 07:14:24 +08:00
2026-05-18 12:53:01 -07:00
2026-04-11 21:25:44 -10:00
2026-04-25 12:25:34 -07:00
2026-05-15 06:48:36 -07:00
2026-04-21 18:35:45 -07:00
2026-05-25 20:00:03 -07:00
2026-04-24 01:39:58 -07:00
2026-05-17 08:00:29 -07:00
2026-05-06 16:32:11 -07:00
2026-05-30 12:07:38 -07:00
2026-06-14 09:32:58 -07:00
2026-05-25 19:43:20 -07:00
2026-06-08 06:16:34 -07:00
2026-04-30 23:17:54 -07:00
2026-04-23 19:34:27 -07:00
2026-06-07 22:05:31 -07:00
2026-06-01 22:01:14 -07:00
2026-05-07 21:52:58 -07:00
2026-04-29 23:46:36 -07:00
2026-07-13 00:08:36 -07:00
2026-05-22 13:38:07 -07:00
2026-07-20 10:46:46 -07:00
2026-07-23 16:13:51 -07:00
2026-06-07 19:12:50 -07:00
2026-05-23 16:46:01 -07:00
2026-05-27 07:01:28 -07:00
2026-05-27 07:01:28 -07:00
2026-05-27 07:01:28 -07:00
2026-05-30 14:56:26 -07:00
2026-05-25 15:46:25 -07:00
2026-07-23 16:13:51 -07:00
2026-05-24 22:56:21 -07:00
2026-07-23 14:09:23 -07:00
2026-05-23 16:46:01 -07:00
2026-07-23 16:13:51 -07:00
2026-05-23 16:46:01 -07:00
2026-05-27 07:01:28 -07:00
2026-05-27 07:01:28 -07:00
2026-05-23 16:46:01 -07:00
2026-05-23 16:46:01 -07:00
2026-05-22 13:38:07 -07:00
2026-05-27 07:01:28 -07:00
2026-05-27 07:01:28 -07:00
2026-07-23 12:55:00 -07:00
2026-05-27 08:27:05 -07:00
2026-05-22 13:38:07 -07:00
2026-05-27 07:01:28 -07:00
2026-04-27 22:59:08 -07:00
2026-05-22 09:10:20 -07:00
2026-05-22 21:18:09 -07:00
2026-05-22 09:10:20 -07:00
2026-07-16 16:57:55 -07:00
2026-07-23 13:53:11 -07:00
2026-05-26 18:29:03 -07:00
2026-04-25 12:25:34 -07:00
2026-04-16 23:03:15 -07:00
2026-07-16 16:57:55 -07:00
2026-07-20 11:35:02 -07:00
2026-05-13 13:14:58 -04:00
2026-05-25 15:10:23 -07:00
2026-05-17 15:41:43 -07:00
2026-05-25 14:20:19 -07:00
2026-04-30 20:47:32 -07:00
2026-05-24 11:37:03 -07:00
2026-07-27 13:29:07 -07:00
2026-07-27 13:29:07 -07:00
2026-07-16 13:34:28 -07:00
2026-05-25 09:57:30 -07:00
2026-07-23 12:57:37 -07:00
2026-05-07 13:17:27 -07:00
2026-07-23 12:29:24 -07:00
2026-05-25 09:57:30 -07:00
2026-06-01 19:09:15 -07:00
2026-07-24 12:11:10 -07:00
2026-04-09 10:17:13 -07:00
2026-05-20 13:55:12 -07:00
2026-06-08 21:19:25 -07:00
2026-05-30 13:11:25 -07:00
2026-07-23 12:02:56 -07:00
2026-05-30 13:11:25 -07:00
2026-04-23 19:34:27 -07:00
2026-05-25 20:00:03 -07:00
2026-04-22 02:07:00 -07:00
2026-05-06 20:39:56 -07:00
2026-05-18 12:53:01 -07:00
2026-05-19 18:12:01 -07:00
2026-06-16 22:45:22 -07:00
2026-05-18 12:53:01 -07:00
2026-04-18 16:57:38 +08:00
2026-05-18 12:53:01 -07:00
2026-05-19 18:12:01 -07:00
2026-05-18 12:53:01 -07:00
2026-05-18 12:53:01 -07:00
2026-05-18 12:53:01 -07:00
2026-06-16 22:45:22 -07:00
2026-05-19 18:12:01 -07:00
2026-04-30 23:17:54 -07:00
2026-06-16 22:45:22 -07:00
2026-05-18 12:53:01 -07:00
2026-06-16 22:45:22 -07:00
2026-05-18 12:53:01 -07:00
2026-05-19 18:12:01 -07:00
2026-05-18 12:53:01 -07:00
2026-05-19 18:12:01 -07:00
2026-05-19 18:12:01 -07:00
2026-05-19 18:12:01 -07:00
2026-05-19 18:12:01 -07:00
2026-05-19 18:12:01 -07:00
2026-05-18 12:53:01 -07:00
2026-05-18 12:53:01 -07:00
2026-05-19 18:12:01 -07:00
2026-05-19 18:12:01 -07:00
2026-05-19 18:12:01 -07:00
2026-04-14 19:41:34 -10:00
2026-05-11 22:54:35 -07:00
2026-05-14 20:51:11 -07:00
2026-05-23 10:21:59 -07:00
2026-05-30 10:56:46 -07:00
2026-05-18 20:55:57 -07:00
2026-05-14 19:13:14 -07:00
2026-05-22 21:04:30 -07:00
2026-05-22 21:04:30 -07:00
2026-05-25 19:53:59 -07:00
2026-05-25 19:53:59 -07:00
2026-04-29 22:21:07 -07:00
2026-07-13 00:09:27 -07:00
2026-07-17 11:27:34 -07:00
2026-07-27 14:16:05 -07:00
2026-05-14 19:13:14 -07:00
2026-07-20 16:28:53 -07:00
2026-06-07 21:43:28 -07:00
2026-05-23 08:49:28 -07:00
2026-07-23 18:48:27 -07:00
2026-07-20 16:28:53 -07:00
2026-05-06 11:54:06 -07:00
2026-06-16 15:08:47 -07:00
2026-06-07 08:05:34 -07:00
2026-06-03 06:28:21 -07:00
2026-05-19 17:14:53 -07:00
2026-06-21 06:36:43 -07:00
2026-04-22 16:24:23 -07:00
2026-04-29 22:21:07 -07:00
2026-04-29 22:21:07 -07:00
2026-04-29 22:21:07 -07:00
2026-04-29 22:21:07 -07:00
2026-05-17 14:02:45 -07:00
2026-04-13 07:49:13 -10:00
2026-05-17 08:51:33 -07:00
2026-07-20 13:56:00 -07:00
2026-04-21 21:14:17 -07:00
2026-07-20 13:56:00 -07:00
2026-05-08 17:07:51 -07:00
2026-04-22 01:34:22 -07:00
2026-05-22 09:10:20 -07:00
2026-05-22 09:10:20 -07:00
2026-05-30 10:30:56 -07:00
2026-04-09 10:17:13 -07:00
2026-06-21 06:36:43 -07:00
2026-07-23 15:26:33 -07:00
2026-06-21 06:36:43 -07:00
2026-06-03 15:24:00 -07:00
2026-05-06 11:54:06 -07:00
2026-06-03 14:14:13 -07:00
2026-06-21 06:36:43 -07:00
2026-05-18 19:34:44 -07:00
2026-07-27 14:16:36 -07:00
2026-05-30 10:56:46 -07:00
2026-06-17 14:02:47 -07:00
2026-05-24 09:30:57 -07:00
2026-04-29 22:53:41 -07:00
2026-06-16 15:08:47 -07:00
2026-06-16 15:08:47 -07:00
2026-06-16 15:08:47 -07:00
2026-05-27 08:50:53 -07:00
2026-05-27 08:50:53 -07:00
2026-07-23 12:57:37 -07:00
2026-06-16 15:08:47 -07:00
2026-07-23 13:38:23 -07:00
2026-07-23 11:24:50 -07:00
2026-06-16 15:08:47 -07:00
2026-07-20 14:06:21 -07:00
2026-06-21 06:36:43 -07:00
2026-06-01 22:28:20 -07:00
2026-07-17 14:41:25 -07:00
2026-05-25 19:53:59 -07:00
2026-07-17 15:43:09 -07:00
2026-07-23 12:02:50 -07:00
2026-06-01 22:28:20 -07:00
2026-07-17 14:41:25 -07:00
2026-06-03 07:47:21 -07:00
2026-07-27 13:45:15 -07:00
2026-07-23 14:09:30 -07:00
2026-07-17 14:41:25 -07:00
2026-07-16 16:22:21 -07:00
2026-05-27 08:50:53 -07:00
2026-07-23 13:38:57 -07:00
2026-07-20 16:28:53 -07:00
2026-07-17 14:41:25 -07:00
2026-05-26 16:58:18 -07:00
2026-07-23 18:48:27 -07:00
2026-05-21 08:29:55 -07:00
2026-07-17 12:10:47 -07:00
2026-07-27 13:45:45 -07:00
2026-05-10 06:34:40 -07:00
2026-05-24 11:37:03 -07:00
2026-05-20 09:19:18 -07:00
2026-07-23 17:13:03 -07:00
2026-07-23 17:28:33 -07:00
2026-07-23 12:02:56 -07:00
2026-05-07 23:07:00 -07:00
2026-05-10 06:34:40 -07:00
2026-05-10 06:34:40 -07:00
2026-07-23 12:02:56 -07:00
2026-05-20 09:19:18 -07:00
2026-07-16 21:20:12 -07:00
2026-05-10 06:34:40 -07:00
2026-06-10 22:00:36 -07:00
2026-07-20 11:25:46 -07:00
2026-07-23 16:45:36 -07:00
2026-05-23 10:01:08 -07:00
2026-05-18 19:34:44 -07:00
2026-07-27 14:11:36 -07:00
2026-05-22 22:37:15 -07:00
2026-07-22 18:46:29 -07:00
2026-07-21 13:06:32 -07:00
2026-05-22 22:37:15 -07:00
2026-07-16 16:31:53 -07:00
2026-07-23 13:54:09 -07:00
2026-07-27 14:11:36 -07:00
2026-05-22 22:37:15 -07:00
2026-05-22 22:37:15 -07:00
2026-05-18 19:34:44 -07:00
2026-06-12 06:05:34 -07:00
2026-06-12 06:05:34 -07:00
2026-07-17 14:25:48 -07:00
2026-05-25 14:43:12 -07:00
2026-05-23 10:21:59 -07:00
2026-05-13 13:14:58 -04:00
2026-05-22 22:37:15 -07:00
2026-07-24 11:50:42 -07:00
2026-04-29 23:46:36 -07:00
2026-07-02 08:00:58 -07:00
2026-04-14 19:41:34 -10:00
2026-05-07 21:52:58 -07:00
2026-04-20 23:14:38 +08:00
2026-05-04 21:11:15 -07:00
2026-04-25 12:25:34 -07:00
2026-05-18 19:34:44 -07:00
2026-05-22 09:10:20 -07:00
2026-05-08 13:25:48 -07:00
2026-05-11 22:54:35 -07:00
2026-05-18 12:53:01 -07:00
2026-05-18 20:55:57 -07:00
2026-05-08 13:25:48 -07:00
2026-07-23 12:02:46 -07:00
2026-05-07 21:52:58 -07:00
2026-05-21 22:11:00 -07:00
2026-07-23 18:48:22 -07:00
2026-05-22 13:38:07 -07:00
2026-07-27 14:13:08 -07:00
2026-05-18 19:34:44 -07:00
2026-06-14 09:32:58 -07:00
2026-05-07 13:41:46 -07:00
2026-05-13 12:21:21 -04:00
2026-04-22 01:34:22 -07:00
2026-06-14 09:32:58 -07:00
2026-06-14 09:32:58 -07:00
2026-07-23 17:28:22 -07:00
2026-05-18 20:55:57 -07:00
2026-05-12 14:33:29 -07:00
2026-05-28 08:20:58 -07:00
2026-05-28 08:20:58 -07:00
2026-06-03 07:27:34 -07:00
2026-05-26 18:29:03 -07:00
2026-07-17 11:33:04 -07:00
2026-06-03 15:24:00 -07:00
2026-05-14 21:06:42 -07:00
2026-05-06 11:54:06 -07:00
2026-06-03 14:14:13 -07:00
2026-06-01 22:01:14 -07:00
2026-07-17 14:41:25 -07:00
2026-07-23 12:42:50 -07:00
2026-07-23 12:02:41 -07:00
2026-07-23 12:13:50 -07:00
2026-04-09 10:17:13 -07:00
2026-05-18 21:11:02 -07:00
2026-05-25 15:10:23 -07:00
2026-05-06 11:54:06 -07:00