--- name: openclaw-skill-portability-claude-codex-gemini description: Use when adapting an OpenClaw SKILL.md for deployment on a non-Claude AI provider (OpenAI GPT/Codex, Google Gemini, Meta Llama, Mistral, or other open models). Covers the adapter pattern for translating SKILL.md frontmatter and body into provider-specific system prompt formats, function-calling schemas, and tool definitions — so a single skill source file can serve multiple AI backends without duplicating legal content. license: MIT metadata: id: openclaw.skill-portability-Claude-Codex-Gemini category: openclaw priority: P2 intent: [openclaw, portability, multi-provider, adapter, skill-translation] related: [openclaw-public-skill-registry, openclaw-contrib-template, openclaw-eval-harness-shared] source: Louis — HAQQ Legal AI (github.com/sboghossian/mini-claude-for-legal) version: "1.0" --- # OpenClaw — Skill Portability ## Purpose OpenClaw skills are authored as provider-neutral SKILL.md files. This skill describes the adapter pattern for translating a SKILL.md into the native prompt format of each major AI provider: Claude (Anthropic), ChatGPT / GPT-4 / Codex (OpenAI), Gemini (Google), Llama (Meta), and open models (Mistral, Qwen, etc.). The goal is a single source of truth for legal AI guidance that can be compiled down to any provider without duplicating or diverging the substantive legal content. ## Key differences by provider | Dimension | Claude (Anthropic) | OpenAI GPT-4/Codex | Gemini (Google) | Llama / Open models | |-----------|-------------------|-------------------|-----------------|---------------------| | System message | `system` turn before user | `{"role": "system", ...}` in messages array | `systemInstruction` field | Varies; typically a `system` role or prepended to the first `user` turn | | Function/tool calling | Tool use via `tools` array + `tool_use` blocks | `tools` array with JSON schema functions | `tools` with `functionDeclarations` | Provider-specific; varies by quantization and GGUF config | | Multi-turn context | `messages` array with `assistant` and `user` roles | Same pattern | `contents` array with `model`/`user` roles | Varies | | Instruction following | High; follows structured markdown | High; prefers numbered instructions | Moderate; benefits from explicit XML-like tags | Varies by model size and fine-tune | | Token limits (as of 2025) | Up to 200k context | Up to 128k (GPT-4o) | Up to 1M (Gemini 1.5) | Varies; typically 4k–128k | ## The adapter pattern ### Step 1 — Extract the directive core From a SKILL.md, identify: 1. **The behavior rule** — what the model must do (from `## Behavior` or `## When to use this`) 2. **The constraints** — what it must never do (from `## Do not` or `## Common mistakes`) 3. **The output format** — schema, structure, required fields 4. **The jurisdiction/practice context** — any MENA or jurisdiction-specific facts This extraction produces a **provider-neutral instruction object** (a plain JSON structure): ```json { "instruction": "...", "constraints": ["...", "..."], "output_format": "...", "context": "..." } ``` ### Step 2 — Compile to provider format #### Claude (Anthropic) ```xml You are a legal AI assistant. Apply the following skill: [instruction] Constraints: - [constraint 1] - [constraint 2] Output format: [output_format] Jurisdictional context: [context] ``` Claude follows structured XML blocks and markdown headings well. Keep skills as named blocks if you are composing multiple skills in a single system prompt (using the `` pattern). #### OpenAI GPT-4 / GPT-4o ```json { "role": "system", "content": "You are a legal AI assistant.\n\nSkill: [skill name]\n\n[instruction]\n\nDo not:\n- [constraint 1]\n- [constraint 2]\n\nOutput format: [output_format]" } ``` OpenAI models respond well to numbered instructions and explicit "Do not" lists. Avoid deeply nested markdown in the system message. #### Function / tool calling (OpenAI format) When a skill produces structured output, define it as a function: ```json { "type": "function", "function": { "name": "review_contract_clause", "description": "Reviews a contract clause against the specified jurisdiction's legal standards.", "parameters": { "type": "object", "properties": { "risk_level": { "type": "string", "enum": ["low", "medium", "high", "critical"] }, "issues": { "type": "array", "items": { "type": "string" } }, "recommendation": { "type": "string" } }, "required": ["risk_level", "issues", "recommendation"] } } } ``` #### Gemini (Google) ```python generation_config = GenerationConfig( system_instruction="You are a legal AI assistant.\n\n[instruction]\n\nDo not:\n- [constraint]\n\nOutput: [format]" ) ``` Gemini 1.5+ supports long system instructions. Use `systemInstruction` at the model initialization level, not in the first `user` turn. For function calling with Gemini, use `FunctionDeclaration` objects analogous to the OpenAI JSON schema pattern. #### Llama / open models For Llama-family models using the standard chat template: ``` <|begin_of_text|><|start_header_id|>system<|end_header_id|> You are a legal AI assistant. [instruction] Do not: - [constraint 1] - [constraint 2] Output format: [output_format] <|eot_id|> <|start_header_id|>user<|end_header_id|> ... ``` For GGUF / llama.cpp deployments, the system prompt is typically passed via the `-sp` flag or the `system_prompt` parameter in the API. For Mistral models, use the `[INST]` / `[/INST]` delimiters for instruction-tuned variants. ## What to preserve across providers These elements must not be lost in translation: - **Jurisdiction-specific guidance** — do not flatten MENA civil-law vs common-law distinctions. - **Hard constraints** ("never fabricate statute numbers") — make these explicit constraints in every provider format. - **Output schema** — if the SKILL.md defines a structured output (`{ riskLevel, issues, recommendation }`), preserve the field names and types in the function/tool definition. - **Escalation rules** — if a skill says "escalate to a licensed lawyer when X", keep that in every provider's compiled version. ## What can be adapted - Formatting markup: markdown headings become plain text sections in providers that don't parse markdown. - Wikilinks (`[[skill-name]]`) are stripped from the compiled output — they are for the skill graph, not the model. - Worked examples in `## Examples` sections can be shortened for providers with tighter context windows. ## Validation After compiling to a new provider format, run the adapted skill against the [[openclaw-eval-harness-shared]] NDA or employment dataset for the relevant jurisdiction. A quality regression vs the Claude baseline of more than 0.3 points on the legal soundness rubric warrants revisiting the translation. ## Related skills - [[openclaw-public-skill-registry]] — the source registry of skills to port - [[openclaw-contrib-template]] — contributing new portable skills - [[openclaw-eval-harness-shared]] — evaluating ported skills against a quality baseline