You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Add Fikra API provider: OpenAI-compatible gateway for open-weight models - #10468
Adds a new OpenAI-compatible gateway provider, Fikra API (fikraapi.co.ke), with 19 model entries covering open-weight DeepSeek, GLM, Kimi, Qwen, MiMo, Nemotron, StepFun and Gemini checkpoints plus the Fikra house lanes.
providers/fikra-api/provider.toml: name, env key, @ai-sdk/openai-compatible, API base https://fikraapi.co.ke/v1, docs link.
providers/fikra-api/logo.svg: brand mark (orange square, Fikra F.A monogram).
19 model TOMLs under providers/fikra-api/models/.
Notes for reviewers
All prices are the provider list prices in USD per 1M tokens, verified on 2026-10-19 against the public catalog (https://fikraapi.co.ke and /docs).
thinking and reasoning_effort are deliberately not exposed by the provider (billing-control choice), so reasoning = false and no reasoning_options everywhere; tool_call, structured_output, temperature are part of the request whitelist and set to true.
qwen3.8-27b carries automatic prompt caching with cache_read 0.10.
step-5-preview description discloses upstream preview instability (repetition loops, high latency) rather than presenting it as a stable lane.
fikra-free-deepseek exists but is unlisted; intentionally omitted.
Happy to adjust model naming or capability flags if the maintainers prefer lab-canonical values.
[critical] [violation]providers/fikra-api/logo.svg:1 - Check: New-provider logo must use currentColor with no fixed size or hardcoded color. Why: File uses width="128" height="128" and hardcoded fill="#FF4500" / fill="#FFFFFF" instead of currentColor. Action: Rewrite logo as square viewBox only with fill="currentColor" / stroke="currentColor" and no width/height or hex colors.
[critical] [violation]providers/fikra-api/models/deepseek-v4.1-flash.toml:1 - Check: Non-lab hosts must use base_model; if nameable lab exists, add/use it and keep provider file override-only. Why: 12 relayed lanes ship full inline with no base_model despite existing lab entries: deepseek/deepseek-v4-flash-0731, deepseek/deepseek-v4.1-flash, deepseek/deepseek-v4.1-flash-1017, zhipuai/glm-5.2, zhipuai/glm-5.3, zhipuai/glm-5.3-flash, moonshotai/kimi-k3, xiaomi/mimo-v2.6-pro, google/gemini-4-argon, alibaba/qwen3.8-27b, stepfun/step-5-preview, and nvidia/nemotron-3.5-super-vl-120b-a12b for nvidia-nemotron-3.5-super-vl. House fikra-* lanes may qualify for unique-to-host exception, these do not. Action: Convert each to base_model="<lab>/<id>" plus only cost, reasoning_options, and proven deltas; create models/nvidia/nemotron-3.5-super-vl.toml if short ID is distinct instead of aliasing the -120b-a12b lab entry.
[critical] [violation]providers/fikra-api/models/deepseek-v4.1-flash.toml:5 - Check:reasoning is a lab fact; a relay that withholds controls must use reasoning=true with [] on affirmative evidence, not reasoning=false to avoid reasoning_options. Why: All 12 labs above have reasoning=true (e.g. models/deepseek/deepseek-v4.1-flash.toml:10, models/zhipuai/glm-5.3.toml:8, models/moonshotai/kimi-k3.toml:7, models/xiaomi/mimo-v2.6-pro.toml:8, models/google/gemini-4-argon.toml:16, models/alibaba/qwen3.8-27b.toml:15, models/stepfun/step-5-preview.toml:8), but PR sets reasoning=false everywhere per “billing-control choice” with no host wire proof. Action: Inherit reasoning=true via base_model and author relay reasoning_options from lab + same-surface peers (DeepSeek toggle+low/high/max, GLM low/high/max, Kimi low/high/max, MiMo toggle, Qwen low/medium/xhigh-family, Gemini low/medium/high, StepFun low/medium/high, Nemotron toggle) with leading wire comments, or provide affirmative host docs proving no reasoning content and use explicit [].
[high] [violation]providers/fikra-api/models/mimo-v2.6-pro.toml:8 - Check: Provider files must not restate/falsify inherited lab facts (open_weights, attachment, temperature, [modalities]). Why: PR sets attachment=false + input=["text"] + open_weights=false/temperature=true on vision/multimodal reasoners whose labs require otherwise and whose own descriptions contradict it: mimo-v2.6-pro “vision and reasoning” vs text-only, qwen3.8-27b “multimodal” vs text-only, nvidia-nemotron-3.5-super-vl document parsing vs attachment=false, glm-5.3-flash lab input=["text","image","video","pdf"] vs ["text"], kimi-k3 lab temperature=false vs true, gemini-4-argon lab temperature=false + 5 modalities vs true + text-only, glm-5.2/glm-5.3/kimi-k3/mimo/step-5-preview labs open_weights=true vs false. Action: After base_model, drop all identical lab fields and keep only proven host deltas (e.g. smaller context/output, PDF-only) with source; fix open_weights by inheritance.
[high] [possible mistake]providers/fikra-api/models/qwen3.8-27b.toml:12 - Check: Provider limit overrides must be evidenced when they contradict the lab. Why: Lab models/alibaba/qwen3.8-27b.toml:21-23 is context=262_144/output=32_768, but provider claims context=1001536/output=65536 (~4× context) while also claiming text-only and cache_read=0.1 without per-field source. Action: Verify served context/output/cache_read against provider docs/API and cite exact source, or inherit lab limits via base_model.
[low] [possible mistake]providers/fikra-api/provider.toml:1 - Check: Data-changing PRs should cite direct provider pricing/docs/API mapped to claims. Why: Body cites only generic https://fikraapi.co.ke and /docs verified 2026-10-19 for 19 cost/limit sets; URLs were not verifiable in review and no per-model mapping is given for prices, stripped modalities, or “no thinking/reasoning_effort” claim. Action: Add direct links stating what each supports (pricing page/section, request whitelist showing absent reasoning fields, limit table) or keep as low-severity evidence request.
[critical] [violation]providers/fikra-api/models/deepseek-v4-flash-0731.toml:1 - Check: Non-lab hosts must use base_model. Why: 12 files name lab models with existing models/ entries (deepseek/deepseek-v4-flash-0731, deepseek/deepseek-v4.1-flash, deepseek/deepseek-v4.1-flash-1017, zhipuai/glm-5.2, zhipuai/glm-5.3, zhipuai/glm-5.3-flash, moonshotai/kimi-k3, xiaomi/mimo-v2.6-pro, alibaba/qwen3.8-27b, google/gemini-4-argon, stepfun/step-5-preview, plus nvidia/nemotron-3.5-super-vl-120b-a12b as closest match for nvidia-nemotron-3.5-super-vl) but ship full inline definitions with no base_model. Action: Convert each to base_model = "<lab>/<model>" override-only files keeping only cost, reasoning_options, and genuine deltas; resolve the exact NVIDIA lab ID or add the missing lab file as a complete lab entry.
[critical] [violation]providers/fikra-api/models/deepseek-v4.1-flash.toml:6 - Check:reasoning = true requires reasoning_options per host role, not reasoning = false to avoid controls. Why: Every lab entry above has reasoning = true and first-party entries expose controls (DeepSeek toggle + low|high|max, Zhipu/Kimi low|high|max, Xiaomi toggle, Alibaba Qwen toggle + budget_tokens, Google/StepFun low|medium|high), and the PR descriptions themselves advertise reasoning; claiming thinking/reasoning_effort are unexposed does not make non-reasoners. Action: Inherit reasoning = true via base_model and author this host's actual forwarded controls per .opencode/skills/audit-reasoning-options/SKILL.md with leading wire comments, or provide affirmative host docs/tests proving no caller control for [] — do not use reasoning = false or [] from uncertainty.
[high] [possible mistake]providers/fikra-api/models/kimi-k3.toml:5 - Check: Provider overrides must match lab facts unless the host really differs. Why: PR sets attachment = false, modalities.input = ["text"], output = 65536 everywhere vs labs with attachment = true and image/video/audio/pdf inputs (e.g. DeepSeek V4.1, GLM-5.3-Flash, Kimi K3, Qwen3.8-27B, MiMo-V2.6-Pro, Gemini 4 Argon, Step 5 Preview, Nemotron VL), flips temperature on Kimi K3 and Gemini 4 Argon and open_weights on GLM-5.2/5.3 and Kimi K3, and inflates/shrinks limits without evidence (qwen3.8-27b context 1001536 vs lab 262144, Nemotron output 65536 vs lab 8192, Step preview output 65536 vs lab 1000000). Action: Inherit these fields via base_model and keep only proven host deltas with evidence; verify whether Fikra truly strips multimodal input or imposes those caps.
[medium] [possible mistake]providers/fikra-api/models/fikra-qwen-27b.toml:1 - Check: Full inline allowed only when provider is the lab or model is unique to host. Why:fikra-qwen-27b ("Fikra-tuned Qwen 27B"), fikra-qwen-max ("Qwen route"), fikra-code-35b, fikra-auto, fikra-auto-pro, fikra-pro-20b, fikra-pro-120b may be routers/aliases of nameable lab models rather than distinct first-party models. Action: Confirm each is a distinct Fikra-owned/fine-tuned model with no sensible models/ identity, otherwise point at the underlying lab entry with base_model and keep only deltas.
[medium] [possible mistake]providers/fikra-api/logo.svg:2 - Check: New-provider logo must remain usable with currentColor. Why:rect and both text elements all use fill="currentColor", so the monogram renders in the same color as its background and is invisible. Action: Redraw as a single-color mark without a solid background rect, or use a transparent background with currentColor foreground only.
Fixes pushed in e4af70c (after the logo fix 2aeb840, which should clear the logo finding once CI re-runs):
All 12 relayed lanes converted to base_model alias files overriding only [cost] and, where genuinely smaller than the lab, [limit] with a source line. deepseek-v4-flash-0731, deepseek-v4.1-flash, deepseek-v4.1-flash-1017, glm-5.2, glm-5.3, glm-5.3-flash, kimi-k3, mimo-v2.6-pro, gemini-4-argon, qwen3.8-27b, step-5-preview, nvidia-nemotron-3.5-super-vl (short ID aliased to nvidia/nemotron-3.5-super-vl-120b-a12b; a distinct short-ID lab entry would need data we cannot cite, so we alias rather than invent).
reasoning = true + reasoning_options = [] on every relay, with a leading wire comment citing the whitelist evidence: thinking and reasoning_effort are not accepted by https://fikraapi.co.ke/docs (verified 2026-10-19), so no control options are offered. No invented effort toggles.
Restated lab facts dropped everywhere: attachment, temperature, open_weights, [modalities], release_date, last_updated now inherit. House fikra-* lanes untouched (unique-to-host).
[high] [violation]providers/fikra-api/models/deepseek-v4-flash-0731.toml:6 - Check: Reasoning-options baseline for multi-model relay. Why: Fikra hosts DeepSeek, Google, Zhipuai, Moonshot, Xiaomi, Nvidia, Alibaba and StepFun, so it is a relay and must copy lab + same-surface peers, not []. Labs/peers all expose caller controls: DeepSeek lab toggle+low|high|max and OpenRouter none|low|high|max, Kimi K3 lab low|high|max, GLM lab low|high|max/high|max, Gemini-4-Argon lab low|medium|high, Step-5-Preview lab low|medium|high, Mimo-V2.6-Pro lab toggle, Qwen3.8-27B peers toggle+low|medium|xhigh (+budget), Nemotron peer none|minimal|low|medium|high|xhigh. All 12 base_model files use reasoning=true + reasoning_options=[] on asserted whitelist only, which is []-from-uncertainty contradicted by baselines. Action: Replace [] per model with the forwarded baseline intersection this host actually exposes, or provide affirmative per-model host docs/live-probe evidence that controls are stripped; do not ship [] while lab/peers expose controls.
[medium] [violation]providers/fikra-api/models/kimi-k3.toml:5 - Check: Override-only provider files after base_model. Why: All 12 relay files restate reasoning = true identical to their labs (models/deepseek/*, models/google/gemini-4-argon.toml, models/zhipuai/*, models/moonshotai/kimi-k3.toml, models/xiaomi/mimo-v2.6-pro.toml, models/nvidia/nemotron-3.5-super-vl-120b-a12b.toml, models/alibaba/qwen3.8-27b.toml, models/stepfun/step-5-preview.toml all have reasoning = true). Action: Delete the redundant reasoning = true lines and inherit from base_model; keep only cost, reasoning_options and genuine limit/modal deltas.
[low] [violation]providers/fikra-api/models/glm-5.3.toml:9 - Check: Source citations must be in leading header block. Why: Mid-file rationale (# Reasoning content is emitted…, # Host serving caps…) on all 12 relay files will be dropped by sync serialization, losing evidence. Action: Move all sources/rationale above the first key into the leading comment block; keep only short wire-syntax comments adjacent to reasoning_options if needed.
[high] [possible mistake]providers/fikra-api/models/fikra-qwen-27b.toml:1 - Check: Non-lab hosts must use base_model unless unique-to-host. Why:fikra-qwen-27b (Fikra-tuned Qwen 27B) and fikra-qwen-max (max-throughput Qwen route) name Qwen lab models and overlap alibaba/qwen3.8-* pricing/limits, suggesting relays, yet ship full-inline with reasoning = false contradicting lab reasoning = true. Action: Point them at the alibaba/* lab entry (adding models/ if missing) with override-only deltas, or document with evidence why they are unique fine-tunes/private aliases and why reasoning = false is accurate.
[medium] [possible mistake]providers/fikra-api/models/qwen3.8-27b.toml:9 - Check: Provider-specific cost must remain provider-authored. Why: Original file had cache_read = 0.1 for automatic caching claimed in PR body, but patch 3 deletes it as “inherit the lab entry” while models/alibaba/qwen3.8-27b.toml has no [cost] to inherit, so resolved output loses the cache price. Action: Restore cache_read with citable host source in the leading header, or confirm the host does not bill cache separately.
Action items addressed in the new commit (4f6864e):
[low] source citations in header block: all rationale now sits above the first key in every provider file; mid-file comment blocks are gone.
[medium] redundant reasoning = true: deleted from all 12 base_model files; the files now carry only description, reasoning_options, [cost] and genuine limit deltas; capability flags inherit the lab.
[high] reasoning_options []: kept empty, with the documented control surface as affirmative host evidence in each header: the request whitelist (https://fikraapi.co.ke/docs, verified 2026-10-19) rejects thinking and reasoning_effort, and reasoning content is emitted on the wire regardless. Copying lab/peer baselines would describe controls this host does not expose. If a per-model live probe shows any control being honored, a follow-up commit will fill the exact honored set.
[possible mistake] inline house files: converted to base_model with override-only deltas (GPT-OSS 20B/120B, Qwen 3.8 27B/Max, a Qwen 3.6 35B coding lane, and the two auto lanes), removing full-inline duplicates and the reasoning = false contradiction.
[medium] logo: providers/fikra-api/logo.svg redrawn as transparent background with currentColor foreground only.
[high] [violation]providers/fikra-api/models/fikra-auto.toml:5 - Check:base_model must identify the actual underlying lab model; auto-routed / house / tuned lanes with no single lab identity must stay standalone. Why: All 7 house lanes now point at guessed labs while admitting upstream mapping is internal to the host — fikra-auto/fikra-qwen-27b → alibaba/qwen3.8-27b, fikra-auto-pro/fikra-qwen-max → alibaba/qwen3.8-max, fikra-code-35b → alibaba/qwen3.6-35b-a3b, fikra-pro-120b → openai/gpt-oss-120b, fikra-pro-20b → openai/gpt-oss-20b. This invents canonical_model_id and inherits wrong lab attachment/modalities/dates/knowledge for router lanes. Action: Cite direct host docs proving each lane is that exact lab checkpoint, or revert house lanes to full standalone unique-to-host definitions.
[high] [violation]providers/fikra-api/models/deepseek-v4-flash-0731.toml:7 - Check: Relay reasoning_options baseline = lab + same-surface peer set, not [] from uncertainty. Why: Lab reasoning=true and peers expose controls — DeepSeek V4 native toggle + effort low|high|max (providers/deepseek/models/deepseek-v4-flash.toml:14-19, providers/fireworks-ai/models/accounts/fireworks/models/deepseek-v4p1-flash-1017.toml:16-21, providers/vivgrid/models/deepseek-v4-flash.toml:6-11), Qwen/Kimi/GLM peers expose toggle/effort/budget_tokens (providers/alibaba/models/qwen3.8-max.toml:14-18, qwen3.6-35b-a3b.toml:13-17, kimi-k3.toml:11-13). All 19 Fikra files use reasoning_options = [] with pending a live probe, i.e. uncertainty. Action: Copy the lab/peer control set this host actually forwards, or provide a live probe/docs excerpt proving thinking/reasoning_effort/enable_thinking/thinking_budget are rejected.
[high] [possible mistake]providers/fikra-api/models/gemini-4-argon.toml:5 - Check: Override-only files must retain real modalities/attachment deltas. Why:google/gemini-4-argon, moonshotai/kimi-k3, xiaomi/mimo-v2.6-pro, nvidia/nemotron-3.5-super-vl-120b-a12b, alibaba/qwen3.8-27b, stepfun/step-5-preview, deepseek/deepseek-v4.1-flash*, zhipuai/glm-5.3-flash are attachment=true multimodal (image/video/audio/pdf), but Fikra files omit [modalities]/attachment and inherit them after originally claiming text-only. Host whitelist cited only covers text/tools, no image path. Action: Verify image/video/audio/pdf support on Fikra or restore attachment=false + modalities.input=["text"] overrides where the host is text-only.
[medium] [violation]providers/fikra-api/models/fikra-code-35b.toml:11 - Check: No restated identical base_model values; provider cost must not drop priced fields. Why:[limit] output=65536 is identical to alibaba/qwen3.6-35b-a3b output and must be omitted, while providers/fikra-api/models/qwen3.8-27b.toml drops the PR-claimed cache_read=0.10 with only lab inherits pending source — the lab has no cost to inherit, so priced caching is lost. Action: Omit the redundant limit, and either restore cache_read with a host source or remove the caching claim.
[low] [possible mistake]providers/fikra-api/models/fikra-auto-pro.toml:10 - Check: Provider limits/descriptions must be supported, not larger than lab without evidence. Why:fikra-auto-pro/fikra-qwen-max claim output=256000 vs lab 131072, fikra-auto/fikra-qwen-27b/fikra-pro-20b/fikra-pro-120b claim output=65536 vs lab 32768, plus with request redaction added to descriptions with no citation while headers admit no citable host limit source. Action: Cite host pricing/docs mapping each larger cap and redaction behavior, or correct to inherited lab values and remove unsupported text.
[critical] [violation]providers/fikra-api/models/fikra-auto.toml:1 - Check: Non-lab hosts must use base_model pointing at the true underlying lab model; unique-to-host lanes must be full standalone definitions (AGENTS.md When to use base_model / Exceptions). Why: All 7 house lanes (fikra-auto.toml, fikra-auto-pro.toml, fikra-code-35b.toml, fikra-pro-120b.toml, fikra-pro-20b.toml, fikra-qwen-27b.toml, fikra-qwen-max.toml) point at arbitrarily chosen labs (alibaba/qwen3.8-27b, alibaba/qwen3.8-max, alibaba/qwen3.6-35b-a3b, openai/gpt-oss-120b, openai/gpt-oss-20b) while the header admits upstream mapping is internal to the host — i.e. no evidence for the mapping. This fabricates canonical_model_id and inherits wrong dates/modalities/attachment/limits/reasoning. Action: Either cite host docs proving each lane maps to that exact lab ID, or convert each lane to a full standalone unique-to-host file with complete required fields (name, description, release_date, last_updated, attachment, reasoning, tool_call, open_weights, limit.context/output, modalities, cost).
[high] [violation]providers/fikra-api/models/deepseek-v4-flash-0731.toml:1 - Check: Relay reasoning_options must copy the lab + same-surface peer baseline; [] only on affirmative no-control, never from uncertainty (AGENTS.md Reasoning options + audit-reasoning-options Steps 2/evidence bar). Why: Same [] with pending a live probe comment is used on all 12 relays (deepseek-v4-flash-0731, deepseek-v4.1-flash, deepseek-v4.1-flash-1017, glm-5.2, glm-5.3, glm-5.3-flash, kimi-k3, mimo-v2.6-pro, gemini-4-argon, qwen3.8-27b, step-5-preview, nvidia-nemotron-3.5-super-vl) plus the 7 house lanes, while baselines expose controls: DeepSeek first-party toggle+effort low|high|max and OpenRouter peers effort none|low|high|max; Zhipu effort low|high|max (glm-5.2 high|max); Kimi effort low|high|max; MiMo toggle; Gemini effort low|medium|high; Alibaba qwen3.8-max toggle+effort low|medium|xhigh+budget, qwen3.6-35b-a3b toggle+budget; StepFun effort low|medium|high; OpenRouter gpt-oss-120b effort low|medium|high. Docs-whitelist omission plus admitted pending probe is explicitly forbidden as basis for []. Action: Author the lab/peer effort/toggle/budget set this host actually forwards with wire-field header comments, or provide a live probe showing controls are stripped/have no effect and keep [].
[medium] [violation]providers/fikra-api/models/fikra-code-35b.toml:12 - Check:base_model files must be override-only; drop restated identical values. Why:[limit] output = 65536 is identical to models/alibaba/qwen3.6-35b-a3b.toml:15 (output = 65_536), so it is a redundant restatement, not a real delta. Action: Remove the identical [limit] block and inherit, or if the host cap truly differs cite the host source and keep only the differing value.
[low] [possible mistake]providers/fikra-api/models/qwen3.8-27b.toml:1 - Check: Costs and PR claims must be consistent and mapped to a source. Why: PR body claims qwen3.8-27b carries automatic prompt caching with cache_read 0.10, but the final file has only input/output with no cache_read and the header says cache pricing inherits the lab entry — models/alibaba/qwen3.8-27b.toml carries no cost to inherit. Action: Restore cache_read = 0.1 with a host pricing/docs citation in the leading header, or correct the PR body if no caching is billed.
Round-3 commit 23a14d0. I ran the live probe the checklist asks for, against the host API itself, and rebuilt the files on the results. Probe evidence (all requests 2026-10-20 against api.fikraapi.co.ke/v1, chat/completions):
Control surface: thinking and reasoning_effort (low/high) are accepted silently (HTTP 200), and every response carries message keys content/role only, no reasoning_content field. Completion-token MWU n=10-16/level across deepseek-v4.1-flash, glm-5.3, qwen3.8-27b: p(base,low)=0.79, p(base,high)=0.11, glm 0.68/0.47, qwen 0.91/0.60, with the one near-significant pair reversed in direction (high effort produced shorter outputs). So [] is now affirmative no-control, not uncertainty.
Upstream identities for fikra-pro-20b / fikra-pro-120b / fikra-code-35b come from the host itself: an image-input request is rejected verbatim with Model openai/gpt-oss-20b does not accept image input, Model openai/gpt-oss-120b does not accept image input, and model qwen3.6-35b-a3b does not support image input. Those three keep base_model with the verbatim error quoted in the header; the other four house lanes have no public host source naming a lab checkpoint, so they are back to full standalone definitions per the When-to-use-base_model rule.
Modality verification: image_url accepted and answered on kimi-k3, mimo-v2.6-pro, nemotron-3.5-super-vl, qwen3.8-27b, glm-5.3-flash, step-5-preview, deepseek-v4.1-flash, and the auto/max/27B house lanes; HTTP 400 on gemini-4-argon, glm-5.2, glm-5.3, deepseek-v4-flash-0731, fikra-pro-20b/120b, fikra-code-35b, which now carry explicit attachment = false + text-only [modalities] overrides.
cache_read = 0.1 restored on qwen3.8-27b and fikra-qwen-27b per the host pricing page; the fikra-code-35b [limit] block identical to the lab is dropped; with request redaction wording removed as uncited.
Deactivated the temporary probe key afterwards; no persistent host-side changes.
[high] [violation]providers/fikra-api/models/fikra-qwen-27b.toml:1 - Check: Non-lab hosts must use base_model when the lab model is nameable; standalone only for unique-to-host identities. Why:Fikra Qwen 27B / Fikra Qwen Max are Qwen-named lanes with costs/limits matching alibaba/qwen3.8-27b (0.045/0.35, 262144 context) and were mapped to alibaba/qwen3.8-27b / alibaba/qwen3.8-max in PATCH 4; PATCH 6 reverts them to standalone with reasoning = false / open_weights = false contradicting lab reasoning = true / open_weights = true for qwen3.8-27b. Action: Restore base_model = "alibaba/qwen3.8-27b" and base_model = "alibaba/qwen3.8-max" override-only files; keep standalone only for truly unmappable router lanes (fikra-auto, fikra-auto-pro) with evidence they have no single lab identity.
[high] [violation]providers/fikra-api/models/deepseek-v4-flash-0731.toml:9 - Check: Override-only provider files must not restate identical base values. Why: Lab deepseek/deepseek-v4-flash-0731 already has attachment = false and modalities input = ["text"] / output = ["text"]; the relay restates both identically while only [limit] output = 65536 vs lab 384_000 is a real delta. Same pattern in glm-5.2.toml, glm-5.3.toml (lab attachment = false, text-only) and fikra-pro-120b.toml / fikra-pro-20b.toml (lab openai/gpt-oss-120b / gpt-oss-20b already attachment = false, text-only). Action: Drop identical attachment and [modalities] blocks in those 5 files and inherit; keep only cost, reasoning_options, and genuine [limit] deltas.
[high] [violation]providers/fikra-api/models/deepseek-v4-flash-0731.toml:8 - Check: Relay reasoning_options must copy lab + same-surface peer baseline, not [] from uncertainty. Why: Lab reasoning = true and first-party providers/deepseek/models/deepseek-v4-flash.toml exposes toggle + effort ["low","high","max"]; Fikra relay claims reasoning_options = [] on header probe assertion alone with no host docs or probe logs in the PR body, while probe notes thinking/reasoning_effort return 200 silently. Action: Replace [] with the DeepSeek baseline (toggle + effort ["low","high","max"] with leading wire comments) or provide host docs / reproducible proof the host strips the control; apply same fix to deepseek-v4.1-flash.toml and deepseek-v4.1-flash-1017.toml.
[high] [violation]providers/fikra-api/models/glm-5.3.toml:6 - Check: Same baseline rule for Zhipu relays. Why: First-party providers/zhipuai/models/glm-5.3.toml and glm-5.3-flash.toml expose effort ["low","high","max"], glm-5.2 baseline is effort ["high","max"]; all three Fikra relays use [] with only a header claim of no reasoning_content and statistical noise. Action: Author the lab effort sets (or prove with host docs/live effect that Fikra removes them); do not ship [] from an unverifiable header.
[high] [possible mistake]providers/fikra-api/models/kimi-k3.toml:6 - Check:[] vs lab/peer controls for remaining relays. Why: Concrete contradiction: moonshotai/kimi-k3 first-party is effort ["low","high","max"] (OpenRouter peer ["none","low","high","max"]), google/gemini-4-argon first-party/peer is ["low","medium","high"], alibaba/qwen3.8-27b peers are ["none","low","medium","xhigh"] / ["none","default","low","medium","high"], alibaba/qwen3.6-35b-a3b first-party is toggle + budget_tokens, xiaomi/mimo-v2.6-pro first-party/peer is toggle, nvidia/nemotron-3.5-super-vl-120b-a12b first-party/peer is toggle, stepfun/step-5-preview peer is ["low","medium","high"], openai/gpt-oss-120b/20b relay consensus is ["low","medium","high"] — all Fikra entries use []. Action: Replace each [] with the corresponding lab/peer set that Fikra forwards, or cite host docs plus a live control-effect demonstration for each stripped host; header MWU claims without data do not meet the [] evidence bar.
[medium] [possible mistake]providers/fikra-api/models/fikra-pro-120b.toml:12 - Check: Provider [limit].output larger than lab without citable host source. Why: Lab openai/gpt-oss-120b/20boutput = 32_768, lab alibaba/qwen3.8-27boutput = 32_768, lab alibaba/qwen3.8-maxoutput = 131_072; Fikra asserts 65_536 and 256_000 respectively citing only generic https://fikraapi.co.ke/pricing, which does not map output caps per model in the PR. Action: Verify against a direct host limits source, restore inherited lab limits if unverifiable, or add a leading header citation to the exact host field documenting the larger cap; same for fikra-pro-20b.toml, fikra-qwen-27b.toml, fikra-qwen-max.toml, fikra-auto-pro.toml.
Control acceptance, all 19 lanes: every request returned HTTP 200 for every control variant (one transient connection reset per lane retried). No response on any lane carried a reasoning_content field; message keys are content/role only (house GPT-OSS lanes also echo name/tool_calls: null). There is no reasoning surface on the wire to modulate.
Effect measurement, raw completion_tokens (baseline / effort=low / effort=high):
deepseek-v4.1-flash n=16: base [102,93,81,84,88,89,93,88,136,87,88,75,100,87,87,83], low (n=10) [100,95,87,99,83,85,90,71,104,85], high [66,73,93,63,98,80,83,90,84,82,79,80,105,100,88,81]; MWU p(base,low)=0.79, p(base,high)=0.11 (median base 87.5 vs high 83.5: the near-significant direction is REVERSED, i.e. high effort produced shorter output, consistent with noise)
glm-5.3 n=10/level: base [239,300,117,104,300,189,274,228,114,225], low [225,300,236,152,300,300,184,216,209,203], high [176,213,300,175,250,228,300,300,252,172]; p=0.68/0.47
qwen3.8-27b n=10/level: base [132,121,125,129,132,137,110,127,141,183], low [126,136,93,158,172,142,161,125,119,124], high [151,125,144,144,126,127,145,128,136,120]; p=0.91/0.60
House lanes (fikra-auto, fikra-auto-pro, fikra-code-35b, fikra-pro-20b, fikra-pro-120b, fikra-qwen-27b, fikra-qwen-max): same prompt with reasoning_effort=high returned 200 on all seven, wire keys without any reasoning field.
fikra-qwen-27b restored to base_model = "alibaba/qwen3.8-27b", fikra-qwen-max to base_model = "alibaba/qwen3.8-max", override-only (cost + cache_read, real limit deltas); the contradictory reasoning = false/open_weights = false flags are gone. fikra-auto/fikra-auto-pro stay standalone (router lanes, no nameable checkpoint).
Identical attachment/[modalities] restatements dropped from deepseek-v4-flash-0731, glm-5.2, glm-5.3, fikra-pro-20b, fikra-pro-120b (labs already false/text-only; the 400 image result is noted as a header comment only). gemini-4-argon keeps its attachment = false + text-only [modalities] override since the lab is multimodal and the host returns 400.
All [limit] blocks now cite the exact host field: GET /v1/modelscontext_window/max_output_tokens (fetched 2026-10-20), which lists per-model caps (e.g. qwen3.8-27b context_window 1001536, nemotron-3.5-super-vl max_output_tokens 65536 vs lab 8192, gpt-oss lanes 65536 vs lab 32768, qwen-max 1048576/256000 vs lab 1000000/131072). Real deltas added where they were missing: context on the deepseek/glm/qwen relays.
reasoning_options = [] kept everywhere, now on the affirmative no-control evidence above (silent 200 acceptance, zero wire reasoning fields, no distinguishable token-count effect) rather than a pending-probe note.
[high] [possible mistake]providers/fikra-api/models/deepseek-v4.1-flash.toml:1 - Check: Multi-model relay reasoning_options must copy the lab + same-surface peer baseline, not [] from uncertainty. Why: All 15 relay lanes set reasoning_options = [] while labs/peers expose controls — DeepSeek lab toggle+effort low|high|max and OpenRouter none|low|high|max; Alibaba qwen3.8-maxtoggle+low|medium|xhigh+budget 0..262144 and qwen3.6-35b-a3btoggle+budget; Zhipu glm-5.3/5.2low|high|max/high|max; Google gemini-4-argonlow|medium|high; OpenRouter kimi-k3none|low|high|max, mimo-v2.6-protoggle, nemotron-3.5-super-vltoggle, step-5-previewlow|medium|high, gpt-oss-120b/20blow|medium|high. Headers cite silent-200 acceptance plus MWU n=10-16, p>=0.11 in the PR thread, which does not prove no wire effect and cannot be verified from the repo. Action: Replace [] with the lab/peer control set this host forwards, or provide verifiable host docs/live evidence that no control changes the wire; same fix applies to deepseek-v4-flash-0731, deepseek-v4.1-flash-1017, glm-5.2, glm-5.3, glm-5.3-flash, gemini-4-argon, kimi-k3, mimo-v2.6-pro, nvidia-nemotron-3.5-super-vl, qwen3.8-27b, step-5-preview, fikra-code-35b, fikra-pro-120b, fikra-pro-20b, fikra-qwen-27b, fikra-qwen-max.
[high] [violation]providers/fikra-api/models/gemini-4-argon.toml:1 - Check: Provider modalities/attachment must reflect host serving reality when it differs from the lab. Why: Lab google/gemini-4-argon is attachment=true with input ["text","image","video","audio","pdf"], but the file header states image content is rejected HTTP 400 live and the file carries no [modalities]/attachment override, so the resolved catalog will falsely advertise image/video/audio/pdf support. Action: Add attachment=false and [modalities] input=["text"] output=["text"] or provide a citable host source showing multimodal support.
[high] [violation]providers/fikra-api/models/fikra-code-35b.toml:1 - Check: Provider modalities/attachment must reflect host serving reality when it differs from the lab. Why: Lab alibaba/qwen3.6-35b-a3b is attachment=true with input ["text","image","video","audio"], header quotes verbatim host error model 'qwen3.6-35b-a3b' does not support image input, but patch 7 removed attachment=false/text-only overrides so the file now inherits true/multimodal and will falsely advertise image support. Action: Restore attachment=false and [modalities] input=["text"] output=["text"] or provide contrary host evidence.
[medium] [possible mistake]providers/fikra-api/models/qwen3.8-27b.toml:1 - Check: Host limit overrides for the same lab must be consistent and supported. Why: Lab alibaba/qwen3.8-27b is context 262_144/output 32_768; this relay claims context 1001536/output 65536 while sibling fikra-qwen-27b.toml for the same lab/host/price (0.045/0.35 + cache_read 0.1) inherits 262_144, a 739k context disagreement that is internally inconsistent and ~4x the lab window. Action: Verify host GET /v1/models context_window/max_output_tokens and align both files to the citable host value or inherit the lab entry.
[medium] [possible mistake]providers/fikra-api/models/deepseek-v4.1-flash-1017.toml:1 - Check:attachment/modalities must not inherit true when the host does not serve images. Why: Lab is attachment=true with image input, header states image request returned 200 but empty content with attachment inherits the lab, which suggests image input is not actually served on this lane. Action: Verify with an image request that returns a grounded answer, or set attachment=false with text-only modalities.
[high] [violation]providers/fikra-api/models/deepseek-v4-flash-0731.toml:1 - Check: Relay reasoning_options must copy lab + same-surface peer baseline, not [] from uncertainty. Why: Fikra hosts many labs so is a multi-model relay. Native DeepSeek is toggle + low|high|max (providers/deepseek/models/deepseek-v4-flash.toml:14-19), Alibaba relay is toggle + high|max (providers/alibaba/models/deepseek-v4-flash-0731.toml:9-12), OpenRouter relay is effort [none,low,high,max] (providers/openrouter/models/deepseek/deepseek-v4-flash-0731.toml:5-7); same pattern holds for qwen3.8-max (toggle+low|medium|xhigh+budget in providers/alibaba/models/qwen3.8-max.toml:14-18), kimi-k3 (low|high|max in providers/alibaba/models/kimi-k3.toml:11-13), gemini-4-argon (low|medium|high in providers/openrouter/models/google/gemini-4-argon.toml:5-7). All 17 relay files use reasoning_options = [] with headers admitting stays empty until a control is shown and citing underpowered probe (n=10-16/level, p>=0.11) plus silent-200 acceptance and no reasoning_content ever observed, which is uncertainty, not affirmative no-control, and is contradicted by peers. Action: Replace [] with the lab/peer-matched controls this host forwards (toggle/effort/budget as applicable) or provide host docs plus peer-consistent proof the host strips all controls and explain why inherited reasoning=true with never-emitted reasoning remains correct.
[high] [violation]providers/fikra-api/models/gemini-4-argon.toml:1 - Check: Provider modalities/attachment must reflect host serving, not just inherit lab. Why: Lab google/gemini-4-argon is attachment=true with input=[text,image,video,audio,pdf], but file has no [modalities]/attachment override while its own header states Image content rejected (HTTP 400) live. Resolved catalog will advertise image/video/audio/pdf that the host rejects. Action: Add genuine delta attachment=false and [modalities] input=["text"] output=["text"] or provide evidence image input works on this host.
[high] [violation]providers/fikra-api/models/fikra-code-35b.toml:1 - Check: Provider modalities/attachment must reflect host serving. Why: Base alibaba/qwen3.6-35b-a3b is attachment=true with input=[text,image,video,audio], but file inherits it while its own header quotes host error model 'qwen3.6-35b-a3b' does not support image input. Same concern for deepseek-v4.1-flash-1017 which inherits image while header says image 200 but returned empty content. Action: Add text-only attachment/modalities overrides where host rejects/empties images, or prove image usefulness on this host.
[high] [possible mistake]providers/fikra-api/models/qwen3.8-27b.toml:14 - Check: Provider [limit].output must not exceed lab max without strong host evidence. Why: Lab outputs are qwen3.8-27b:32768 vs provider 65536, nvidia/nemotron-3.5-super-vl-120b-a12b:8192 vs providers/fikra-api/models/nvidia-nemotron-3.5-super-vl.toml:output=65536, openai/gpt-oss-120b|20b:32768 vs fikra-pro-120b|20b:output=65536, alibaba/qwen3.8-max:131072 vs fikra-qwen-max:output=256000, plus qwen3.8-27b:context 262144 vs provider 1001536. Host cannot serve larger outputs than the model supports; header cites GET /v1/models but no raw values are in the PR body to review. Action: Correct limits to lab values or paste host context_window/max_output_tokens raw rows into the PR body and confirm USD/MTok pricing source for the changed cache_read/output prices.
[high] [violation]providers/fikra-api/provider.toml:1 - Check: New OpenAI-compatible provider must set opencodeai for its default API (AGENTS.md → Adding a provider). Why: File sets npm = "@ai-sdk/openai-compatible" + api but no opencodeai; every existing providers/*/provider.toml sets it (e.g. @opencode/ai/providers/openai-compatible or "none"), otherwise no OpenCode package is filled for the default API. Action: Add opencodeai = "@opencode/ai/providers/openai-compatible" (or "none" with rationale) to provider.toml.
[high] [violation]providers/fikra-api/models/gemini-4-argon.toml:12 - Check: Override-only base_model files must not restate identical inherited values (AGENTS.md → Override-only). Why: Multiple files copy lab values verbatim: gemini-4-argon (context 1048576/output 65536 identical to models/google/gemini-4-argon.toml), mimo-v2.6-pro (identical to models/xiaomi/mimo-v2.6-pro.toml), fikra-code-35b (262144/65536 identical to models/alibaba/qwen3.6-35b-a3b.toml), plus identical single fields — deepseek-v4.1-flash output 384000, fikra-pro-20b/fikra-pro-120b context 131072, fikra-qwen-27b context 262144, qwen3.8-27b output 32768, glm-5.2/glm-5.3/glm-5.3-flash output 131072, step-5-preview output 1000000, nvidia-nemotron-3.5-super-vl context 1048576. Action: Delete every [limit] key equal to the lab value; keep only genuine host deltas (e.g. keep differing output/context, drop the matching one; drop the whole [limit] when both match).
[high] [violation]providers/fikra-api/models/gemini-4-argon.toml:9 - Check: Resolved modalities must match what the host actually serves; arrays replace on merge. Why:base_model = "google/gemini-4-argon" inherits image/video/audio/pdf input, but file comment states image rejected HTTP 400 live with no [modalities] narrowing, so v2 would falsely advertise image support. Same pattern in fikra-code-35b.toml (inherits alibaba/qwen3.6-35b-a3b image/video yet comment quotes host error does not support image input) and deepseek-v4.1-flash-1017.toml (inherits image input yet comment says image returns empty content while claiming attachment inherits the lab). Action: Add host-accurate [modalities] overrides (e.g. input = ["text"] where host rejects images) or verify with per-model evidence that video/pdf/image are served.
[high] [violation]providers/fikra-api/models/qwen3.8-27b.toml:16 - Check:cost.text.input.cache.read must correspond to a declared capabilities.cache kind; unlisted kinds are unsupported. Why: 9 files price cached reads but declare no [capabilities] cache: deepseek-v4-flash-0731/deepseek-v4.1-flash/deepseek-v4.1-flash-1017 (read = 0.025), glm-5.2 (0.55), glm-5.3 (0.55), glm-5.3-flash (0.08), kimi-k3 (0.6), mimo-v2.6-pro (0.012), qwen3.8-27b (0.1 with header claiming automatic caching). Resolved output would bill cache reads for a host with no cache support. Action: Add matching capabilities.cache (e.g. cache = { implicit = true } if automatic with no markers, or explicit details) or remove the cache.read prices.
[high] [violation]providers/fikra-api/models/deepseek-v4-flash-0731.toml:10 - Check: Reasoning provider models must author this host's controls; multi-model relay baseline is lab + same-surface peers, flag missing controls only from uncertainty (AGENTS.md → Reasoning controls + audit skill). Why: Host is a multi-model relay (many labs), yet all 17 relays use bare reasoning = { supported = true } while lab/peer entries expose controls: DeepSeek V4 toggle + effort ["low","high","max"] (providers/deepseek/models/deepseek-v4-flash.toml), Qwen toggle + effort ["low","medium","xhigh"] + budget (providers/alibaba/models/qwen3.8-27b.toml, qwen3.8-max.toml), GLM effort ["low","high","max"] (providers/zhipuai/models/glm-5.3.toml), Kimi effort ["low","high","max"] (providers/moonshotai/models/kimi-k3.toml), Gemini effort ["low","medium","high"] (providers/google/models/gemini-4-argon.toml), MiMo toggle (providers/xiaomi/models/mimo-v2.6-pro.toml), Nemotron toggle / effort ["none","high"] (providers/nvidia/..., providers/nebius/...), gpt-oss effort ["low","medium","high"] (providers/groq/models/openai/gpt-oss-120b.toml). Identical copy-pasted MWU p >= 0.11 boilerplate with raw data only in PR thread is uncertainty, not affirmative per-model no-control proof. Action: Author per-model toggle/effort/budget copied from lab + peers where the host forwards them, or provide per-model affirmative wire evidence (exact fields tried, request/response excerpts showing no reasoning_content and no effort effect) justifying always-on.
[medium] [possible mistake]providers/fikra-api/models/qwen3.8-27b.toml:12 - Check: Host limit deltas must be plausible vs lab models/alibaba/qwen3.8-27b.toml (context 262144, output 32768). Why: Same-host fikra-qwen-27b.toml keeps 262144 for the same base_model, but qwen3.8-27b.toml claims context 1001536 (~3.8× lab) with identical output; no host can serve 4× the lab window without explanation and the two lanes contradict each other. Action: Verify the host GET /v1/modelscontext_window for both IDs and correct the erroneous lane, citing which host ID carries which window.
Converted the provider to schema v2, rebased on dev, and updated the model limits/prices to the live Fikra values. bun validate is green. 1017 now advertises 1,048,576 context and 393,216 output; v4.1 Flash 384,000; 0731 131,072.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds a new OpenAI-compatible gateway provider, Fikra API (fikraapi.co.ke), with 19 model entries covering open-weight DeepSeek, GLM, Kimi, Qwen, MiMo, Nemotron, StepFun and Gemini checkpoints plus the Fikra house lanes.
providers/fikra-api/provider.toml: name, env key,@ai-sdk/openai-compatible, API basehttps://fikraapi.co.ke/v1, docs link.providers/fikra-api/logo.svg: brand mark (orange square, Fikra F.A monogram).providers/fikra-api/models/.Notes for reviewers
thinkingandreasoning_effortare deliberately not exposed by the provider (billing-control choice), soreasoning = falseand noreasoning_optionseverywhere;tool_call,structured_output,temperatureare part of the request whitelist and set to true.qwen3.8-27bcarries automatic prompt caching with cache_read 0.10.step-5-previewdescription discloses upstream preview instability (repetition loops, high latency) rather than presenting it as a stable lane.fikra-free-deepseekexists but is unlisted; intentionally omitted.Happy to adjust model naming or capability flags if the maintainers prefer lab-canonical values.