mcpField
S
subconscious-dev

subconscious-dev

github.com/subconscious-systems開発052 回インストール23 週間前に更新
リポジトリ

subconscious-dev について

subconscious-devは、ファインチューニング済みQwen-3.6を使うOpenAI SDK互換のチャット補完サービスです。OpenAIクライアントで推論を組み込む開発者向けで、関数ツール、構造化出力、ストリーミング、思考モードの切り替えに対応します。

主な機能

  1. 01OpenAI互換のチャット補完
  2. 02標準関数ツール呼び出し
  3. 03JSONと構造化出力
  4. 04SSEストリーミング応答
  5. 05思考モードの設定

活用シーン

  1. 01既存のOpenAI SDKアプリからモデルを呼び出す
  2. 02生成フロー向けの関数ツール定義
  3. 03指定スキーマに沿ったJSON生成
  4. 04チャット画面でのストリーミング出力処理

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/subconscious-systems/skills --skill subconscious-dev

インストール後、Claude Code で/subconscious-devを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
api-reference.md
best-practices.md
examples.md
multimodal.md
structured-output.md
thinking.md
tools.md

詳細

Subconscious のチャット補完

Subconscious は、sglang で提供されるファインチューニング済み Qwen-3.6 による、OpenAI SDK 互換の推論サービスです。OpenAI クライアントの接続先にベース URL を指定すると、標準の OpenAI フィールドに加え、推論用の設定を 1 つ利用できます。

製品の全体像を 6 行で

from openai import OpenAI

client = OpenAI(
    base_url="https://api.subconscious.dev/v1",
    api_key="sky_...",  # or set SUBCONSCIOUS_API_KEY
)

resp = client.chat.completions.create(
    model="subconscious/tim-qwen3.6-27b",
    messages=[{"role": "user", "content": "Hello"}],
)

以上がすべてです。残りのドキュメントでは、適切な使い方を説明します。

重要なコンテキスト — まずお読みください

  1. ベース URL は 1 つです。 https://api.subconscious.dev/v1。推論は Baseten ゲートウェイの背後で sglang によって提供されます。エンドポイント:POST /chat/completions(主要)、POST /completions(レガシーな OpenAI テキスト補完)、GET /models。POST /v1/responses は URL 空間には存在しますが、機能しません。どのような入力形式でも sglang エラーを返します。
  2. モデルは 1 つです。 subconscious/tim-qwen3.6-27b — ファインチューニング済み Qwen-3.6、fp8 量子化。完全な機能仕様は GET /v1/models から取得してください(はい、そのエンドポイントは存在します)。
  3. コンテキスト長は、公開ダッシュボード/TIMRUN の位置付けによれば数百万トークンです。 /v1/models エンドポイントは現在、context_length: 8192 と max_completion_tokens: 5000 を報告しています。これはこのデプロイで安全に利用できる実行時の上限として扱い、製品の上限とはみなさないでください。ダッシュボードと API の応答が異なる場合は、ダッシュボードの記載を優先し、ご自身のワークロードで検証してください。
  4. モダリティはテキストが中心です:モデル仕様では input_modalities: ["text"] とされていますが、実際には多くの画像ソース(プレースホルダー、データ URL)でビジョンが機能します。Wikipedia の URL は一貫して 500 エラーになります。音声、ファイル、動画のブロックはすべて 400 エラーを返します。詳しくは references/multimodal.md を参照してください。ビジョンは、公式サポート対象ではなく、ドキュメント化されていないものの機能する機能として扱ってください。
  5. 思考はデフォルトでオンです。 オンの場合、モデルは回答の前に「思考プロセスです:」という散文のブロックを付けます(<think> タグはなく、通常のテキストです)。chat_template_kwargs.enable_thinking: false を設定すると無効にできます。これは OpenAI/ChatGPT とは逆の動作です。
  6. モデル仕様で有効になるサンプリングパラメーターは temperature と stop のみです。 top_p、seed、n、frequency_penalty、logit_bias などのフィールドは、200 を返しますが、Baseten/sglang によって黙って無視されます。

設定

# .env
SUBCONSCIOUS_API_KEY=sky_yNZq...

OpenAI SDK はデフォルトで OPENAI_API_KEY を読み取ります。api_key= を明示的に渡すか、OPENAI_API_KEY に Subconscious のキーを設定してください。ベース URL に対して、実際の OpenAI キーを使わないでください。

認証

Authorization: Bearer <SUBCONSCIOUS_API_KEY>
ケースステータス
Authorization ヘッダーがない401
ヘッダーはあるが、キーが無効403
有効なキー200

モデルが実際に反映するもの

ダッシュボードでは、TIM-Qwen3.6-27B について次のように紹介されています。

  • 数百万トークンのコンテキスト
  • 最先端レベルのエージェント性能
  • ベースモデルの75%の計算量
  • 持続的なスループットが50%高速

これらは製品レベルの主張であり、正式な情報として扱ってください。

GET /v1/models が返すのは、より限定的な現在のランタイムスナップショットです。

{
  "id": "subconscious/tim-qwen3.6-27b",
  "context_length": 8192,
  "max_completion_tokens": 5000,
  "quantization": "fp8",
  "supported_sampling_parameters": ["temperature", "stop"],
  "supported_features": ["tools", "json_mode", "structured_outputs", "reasoning"],
  "input_modalities": ["text"],
  "output_modalities": ["text"]
}

出力に影響する標準のOpenAIリクエストフィールド:

フィールド備考
model必須。subconscious/tim-qwen3.6-27b。
messages必須。ロール:system / user / assistant / tool。developer と function(非推奨)のロールは400を返します。文字列コンテンツ。
temperature反映されます。確認済み:temperature: 0 にすると、呼び出しごとに同一の出力が生成されます。
stop反映されます。停止シーケンスの配列です。finish_reason: "stop" が設定されます。
max_tokens / max_completion_tokensハード上限。切り捨てられることを確認済みです。最大5000。
n反映されます。1回のバッチ呼び出しからn個の選択肢を返します。
streamtrueの場合はSSE。
stream_options{include_usage: true} を指定すると、最後に使用量のチャンクが出力されます。
tools標準のOpenAI function ツールのみ対応します。新しいcustomツールタイプは400を返します。
tool_choice4つのモードすべてが動作します:"auto"(デフォルト)、"none"、"required"、{type: "function", function: {name}}。
response_formatjson_schema と json_object の両方のモードが動作します。
reasoning_effort列挙値として検証されます:none / low / medium / high は受け付けられます。minimal と xhigh は400を返します。出力への影響は未確認です。これはQwenモデルであり、oシリーズの推論モデルではありません。

受け付けられますが、無視される可能性が高いフィールド(200を返すことは確認済みですが、モデルのsupported_sampling_parametersには含まれていません):

  • サンプリング:top_p、top_k、seed、frequency_penalty、presence_penalty、logit_bias、logprobs、top_logprobs、parallel_tool_calls
  • 識別情報/キャッシュ:user、safety_identifier、prompt_cache_key、prompt_cache_retention、service_tier(auto / default / flex / priorityのいずれも)
  • ストレージ:store、metadata
  • 出力設定:modalities(このフィールドは出力モダリティを制御します。["text", "audio"]などを指定できますが、このモデルが出力するのはテキストのみなので、音声は出力されません。image_urlコンテンツブロックによる入力画像認識は別機能で、動作します。詳しくはreferences/multimodal.mdを参照してください)、audio(音声出力の音声/形式設定。音声出力には対応しません)、verbosity、prediction、web_search_options
  • 非推奨:function_call、functions(代わりにtool_choiceとtoolsを使用してください)

これらのフィールドが動作に実際に影響することをアプリが前提としている場合、Subconsciousでは機能しません。

400で拒否されます:

  • カスタムツールタイプ({type: "custom", ...})— functionツールのみ動作します
  • developerロールのメッセージ
  • functionロールのメッセージ(非推奨)
  • reasoning_effort=minimalとreasoning_effort=xhigh(その他の列挙値4つはスキーマ検証を通過します)

Subconscious固有の設定項目:chat_template_kwargs.enable_thinking

OpenAI SDKのextra_bodyを介して渡します。

extra_body={
    "chat_template_kwargs": {"enable_thinking": False},
}
  • デフォルト(オン):モデルは「Here's a thinking process:」のような文で始まるメタ推論の前置きを出力し、番号付きの手順に続いて実際の回答を出力します。これを囲むタグはありません。すべてプレーンテキストとしてmessage.contentに含まれます。
  • enable_thinking: false:モデルは前置きを省略し、直接回答します。

ユーザー向けのチャットや構造化出力では、通常falseを指定します。references/thinking.mdを参照してください。

ストリーミング時にはstream_options.include_usage: trueも便利です。このフィールドはSubconscious固有ではなく、標準のOpenAIフィールドです。

ツール — 標準的な OpenAI の関数呼び出し

標準的な OpenAI のツール形式のみが動作します。

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Get current weather in a city",
        "parameters": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    },
}]

resp = client.chat.completions.create(
    model="subconscious/tim-qwen3.6-27b",
    messages=[{"role": "user", "content": "Weather in Boston?"}],
    tools=tools,
    extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)

tool_calls = resp.choices[0].message.tool_calls
# [{ id: "call_...", function: { name: "get_weather", arguments: '{"city":"Boston"}' } }]

モデルは tool_calls 配列を出力します。コードで関数を実行した後、結果を含む role: "tool" のフォローアップメッセージを送信します。標準的な OpenAI のツールループです。このエンドポイントでは、Subconscious がサーバー側でツールを実行することはありません。

Subconscious 固有のツールタイプ(type: "platform"、MCP、URL ベースの関数ツール)は、このエンドポイントではサポートされていません。これらを使用すると、function が欠落しているという検証エラーが返され、ステータスコードは 400 になります。

構造化出力

schema = {
    "type": "object",
    "properties": {
        "sentiment": {"type": "string", "enum": ["positive", "neutral", "negative"]},
        "confidence": {"type": "number"},
    },
    "required": ["sentiment", "confidence"],
}

resp = client.chat.completions.create(
    model="subconscious/tim-qwen3.6-27b",
    messages=[{"role": "user", "content": "Analyze: 'works great'"}],
    response_format={
        "type": "json_schema",
        "json_schema": {"name": "sentiment", "schema": schema},
    },
    extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)
import json
result = json.loads(resp.choices[0].message.content)

json_mode と structured_outputs はどちらも supported_features に含まれています。enable_thinking: false の場合はクリーンな JSON が得られます。thinking を有効にすると、解析前に文章形式の前置きを取り除く必要があります。

ストリーミング

stream = client.chat.completions.create(
    model="subconscious/tim-qwen3.6-27b",
    messages=[{"role": "user", "content": "Haiku about Boston."}],
    stream=True,
    stream_options={"include_usage": True},
    extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)

for chunk in stream:
    delta = chunk.choices[0].delta if chunk.choices else None
    if delta and delta.content:
        print(delta.content, end="", flush=True)
    if chunk.usage:
        print(f"\n[in={chunk.usage.prompt_tokens} out={chunk.usage.completion_tokens}]")

include_usage: true を設定すると、[DONE] の前の最後のチャンクに usage が含まれます。標準的な OpenAI SSE 形式です。

ステータスコード

ステータス意味対応方法
200OK本文を読み取ります
400本文の形式が不正です(必須フィールドの欠落、ツール形式の誤り)リクエストを修正します
401認証ヘッダーがありませんAuthorization: Bearer ... を追加します
403API キーが無効ですSUBCONSCIOUS_API_KEY を確認します
404不明なモデルですsubconscious/tim-qwen3.6-27b を使用します
429レート制限に達しました時間をおいて再試行し、Retry-After に従います
500サーバーまたは上流のエラーです指数バックオフで再試行します

エラー本文の形式:

// sglang validation error
{"error": {"code": 400, "message": "...", "object": "error", "param": null, "type": "Bad Request"}}

// Simpler errors (auth, missing model)
{"error": "string"}

OpenAI SDK は型付きの例外(AuthenticationError、RateLimitError、BadRequestError など)を発生させます。本文を解析するより、これらを使用してください。

ベストプラクティス

  • チャット/構造化出力/分類では、デフォルトで enable_thinking: false にします。 レイテンシーを大幅に削減し、出力をより明確にできます。
  • 難しい推論(調査の統合、コード生成、計画)では、enable_thinking: true のままにします。
  • すべての呼び出しで max_tokens を設定します。 サーバー側に固定のデフォルト値はありません。生成が際限なく続くと費用がかかります。
  • ユーザー向けの画面で体感レイテンシーが 1 秒を超える場合は、stream=True を使用します。
  • ストリーミング呼び出しでは、コストを追跡できるように stream_options.include_usage: true を追加します。
  • top_p、seed、frequency_penalty などには依存しないでください。 ステータスコード 200 が返りますが、これらの値は反映されません。
  • メッセージ履歴は適切な長さに制限します。 ダッシュボードでは数百万トークンとされていますが、このデプロイ環境の /v1/models は 8192 と報告します。実際に必要なサイズをテストしてください。長いプロンプトは、気づかないうちに切り詰められることがあります。
  • Vision は動作しますが、ドキュメントには記載されていません。 データ URL(data:image/png;base64,...)が確実に動作する方法です。Wikipedia の URL は常に 500 を返します。音声/ファイル/動画は確実に動作しません(400/500)。references/multimodal.md を参照してください。

TypeScript / Node

import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://api.subconscious.dev/v1',
  apiKey: process.env.SUBCONSCIOUS_API_KEY!,
});

const resp = await client.chat.completions.create({
  model: 'subconscious/tim-qwen3.6-27b',
  messages: [{ role: 'user', content: 'Hello' }],
  // @ts-expect-error chat_template_kwargs is a Subconscious extension
  chat_template_kwargs: { enable_thinking: false },
});

cURL

curl https://api.subconscious.dev/v1/chat/completions \
  -H "Authorization: Bearer $SUBCONSCIOUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "subconscious/tim-qwen3.6-27b",
    "messages": [{"role": "user", "content": "ping"}],
    "max_tokens": 50,
    "chat_template_kwargs": {"enable_thinking": false}
  }'

料金

https://www.subconscious.dev/platform の公開ダッシュボードに基づく料金です(実際の請求とは照合していません)。

  • 入力:$0.50 / 100 万トークン
  • 出力:$3.50 / 100 万トークン

GET /v1/models の pricing フィールドはゼロを返しますが、これはプレースホルダーであり、料金ではありません。実際の料金はダッシュボード/ドキュメントで確認してください。

思考トークンは出力としてカウントされます。測定値(各 3 回実行した中央値、2026-05-22):

プロンプトオフオン比率
"Hello"8 トークン257 トークン32 倍
"Capital of France one word"2 トークン176 トークン88 倍
"Explain quantum tunneling, 2 sentences"53 トークン600 トークン(上限に到達)11 倍
"Solve 17*23 step by step"600(上限に到達)600(上限に到達)上限時は約 1 倍

短いプロンプトでは、thinking をオンにするとコストが大幅に増加します。長い出力を求めるプロンプトでは、どちらのモードでも max_tokens に達する場合があります。

注:/v1/models が返す pricing フィールドは、現在ゼロを示しています。これはモデル仕様のエンドポイントであり、請求情報のエンドポイントではありません。料金についてはダッシュボード/ドキュメントを参照してください。

リファレンス

  • references/api-reference.md — エンドポイント、完全なリクエスト/レスポンスの形式、エラー形式
  • references/thinking.md — 思考機能の実際の動作、デフォルトで有効、前置きの削除方法
  • references/tools.md — OpenAI の関数呼び出しパターン、ツールの全処理フロー、受け入れられる内容と拒否される内容
  • references/structured-output.md — JSON Schema と Pydantic/Zod を使用した response_format
  • references/multimodal.md — ビジョン(データ URL では動作し、URL でも動作する場合があります)、音声/ファイル/動画(すべて拒否されます)
  • references/best-practices.md — 本番環境でのパターン、コストのモニタリング、再試行
  • references/examples.md — 動作するコードスニペット(Python、TypeScript、cURL)

リソース

コメント